home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Workbench Design
/
WB Collection.iso
/
workbench werkzeuge
/
icon tools
/
forceicon
/
source
/
ficonprefs.c
< prev
next >
Wrap
C/C++ Source or Header
|
1996-04-07
|
98KB
|
3,782 lines
/*
Auto: smake FIconPrefs
*/
/* $Revision Header built automatically *************** (do not edit) ************
**
** © Copyright by GuntherSoft
**
** File : SnakeSYS:CPrgs/ForceIcon2/FIconPrefs.c
** Created on : Wednesday, 16.03.94 16:19:51
** Created by : Kai Iske
** Current revision : V1.0
**
**
** Purpose
** -------
** - Prefs Editor for ForceIcon
**
** Revision V1.0
** --------------
** created on Wednesday, 16.03.94 16:19:51 by Kai Iske. LogMessage :
** --- Initial release ---
**
*********************************************************************************/
/**********************************************************************/
/* Define for DisplayError() */
/**********************************************************************/
#define PREFSRUN
/**********************************************************************/
/* Routines for this module */
/**********************************************************************/
static BOOL OpenAll(void);
static void CloseAll(void);
static struct FIconSema *FindFIconSema(void);
static void RemoveFIconSema(struct FIconSema *FIconSema);
static BOOL InitApp(void);
static void RemoveApp(void);
static ULONG __saveds __asm DispViewFunc(register __a0 struct Hook *MyHook, register __a2 char **array, register __a1 struct VolEntry *Data);
static ULONG __saveds __asm DisableFunc(register __a0 struct Hook *MyHook, register __a2 APTR Obj, register __a1 APTR *Data);
static ULONG __saveds __asm PageChangeFunc(register __a0 struct Hook *MyHook, register __a2 APTR Obj, register __a1 APTR *Data);
static struct VolEntry *AddNewVolume(char *Name, ULONG Type, struct VolEntry *CopyPtr);
static BOOL CheckExists(struct List *CheckList, char *Name);
static BOOL SavePrefs(BOOL EnvMode, char *ToName);
static void DskChange(struct VolEntry *ListEntry);
static BOOL GetTaskList(struct List *AppList);
static BOOL GetFileName(struct Window *Window, char *Title, char *FileName, ULONG Flags1);
static BOOL CloneList(struct List *ToList, struct List *FromList);
/**********************************************************************/
/* Functions of files included */
/**********************************************************************/
// LoadPrefs.h
static BOOL LoadPrefs(struct FIconSema *FIconSema, char *TryName);
// VolList.h
static BOOL GetDevVolList(struct List *VolList);
static BOOL GetDosEntries(struct List *VolList, ULONG Mode);
static void FreeDevVolList(struct List *VolList);
static void SortList(struct List *VolList, BOOL DisplayType);
static void SortPartialList(struct List *VolList, UWORD Left, UWORD Right);
static APTR GetListEntry(struct List *List, WORD EntryNum);
static BOOL MyStrCmp(char *FromName, char *ToName);
// Error.h
static BOOL __stdargs DisplayError(LONG ErrCode, ULONG Arg1, ...);
// CheckToolTypes.h
static void CheckToolTypes(struct WBStartup *WBenchMsg);
// PoolVec.h
static APTR AllocVecPool(struct FIconSema *FIconSema, ULONG Size);
static void FreeVecPool(struct FIconSema *FIconSema, APTR Addr);
/**********************************************************************/
/* Library bases */
/**********************************************************************/
struct ExecBase *SysBase;
struct IntuitionBase *IntuitionBase = NULL;
struct DosLibrary *DOSBase = NULL;
struct GfxBase *GfxBase = NULL;
struct Library *IconBase = NULL;
struct Library *UtilityBase = NULL;
struct Library *IFFParseBase = NULL;
struct Library *MUIMasterBase = NULL;
/**********************************************************************/
/* "No-StartUp vars" */
/**********************************************************************/
#define MUIVERS "$VER:ForceIcon_Prefs "REVISION" ("REVDATE")"
char _ProgramName[] = "ForceIconPrefs";
LONG _OSERR = 0;
/**********************************************************************/
/* Our variables */
/**********************************************************************/
static struct FIconSema *FIconSema = NULL; // Pointer to our rendezvous semaphore
static struct List AvailableList;
static struct List AppAvailableList;
static struct List BackUpVolList;
static struct List BackUpAppList;
static UWORD FlushMemory = FALSE;
/**********************************************************************/
/* Application and window definitions */
/**********************************************************************/
static struct DiskObject *DObj = NULL;
static APTR AppObject = NULL;
static APTR MainWindow = NULL;
static APTR UsedList;
static APTR EditEntry;
static APTR CopyEntry;
static APTR RemoveEntry;
static APTR AvailList;
static APTR AddEntry;
static APTR AddEntryMan;
static APTR RescanList;
static APTR AppUsedList;
static APTR AppEditEntry;
static APTR AppCopyEntry;
static APTR AppRemoveEntry;
static APTR AppAvailList;
static APTR AppAddEntry;
static APTR AppAddEntryMan;
static APTR AppRescanList;
static APTR SaveObj;
static APTR UseObj;
static APTR HideObj;
static APTR EditWindow;
static APTR VolumeName;
static APTR VolumeType;
static APTR IconPosGroup;
static APTR IconPos[2];
static APTR IconX;
static APTR IconY;
static APTR Position;
static APTR UseIconGroup;
static APTR UseIcon[2];
static APTR IconName;
static APTR UseWindowGroup;
static APTR UseWindow[2];
static APTR WinX;
static APTR WinY;
static APTR WinWidth;
static APTR WinHeight;
static APTR LookWin;
static APTR UseFlagsGroup;
static APTR UseFlags[2];
static APTR FlagModes;
static APTR EditOkObj;
static APTR EditCancelObj;
static APTR AppEditWindow;
static APTR AppTaskName;
static APTR AppIconPos;
static APTR AppIconX;
static APTR AppIconY;
static APTR AppPosition;
static APTR AppUseIcon;
static APTR AppIconName;
static APTR AppEditOkObj;
static APTR AppEditCancelObj;
static APTR ManWindow;
static APTR ManVolName;
static APTR ManVolType;
static APTR ManOkObj;
static APTR ManCancelObj;
static APTR AppManWindow;
static APTR AppManTaskName;
static APTR AppManOkObj;
static APTR AppManCancelObj;
/**********************************************************************/
/* Page titles */
/**********************************************************************/
static const char *MainWinPageTitles[] =
{
"Volumes/Devices",
"AppIcons",
NULL
};
/**********************************************************************/
/* Strings for Cycle gadgets */
/**********************************************************************/
static const char *TypeEntries[] =
{
"Volume",
"Device",
NULL
};
static const char *ModeEntriesVol[] =
{
"Ignore",
"Use",
"Inherit",
NULL
};
static const char *ModeEntriesDev[] =
{
"Ignore",
"Use",
NULL
};
static const char *PositionEntries[] =
{
"Open position window",
"Close position window",
NULL
};
static const char *LookWinEntries[] =
{
"Open window",
"Close window",
NULL
};
static const char *FlagModesEntries[] =
{
"only icons + view by icon",
"only icons + view by name",
"only icons + view by date",
"only icons + view by size",
"all files + view by icon",
"all files + view by name",
"all files + view by date",
"all files + view by size",
NULL
};
/**********************************************************************/
/* Menu definition */
/**********************************************************************/
static struct NewMenu MainMenuDef[] =
{
NM_TITLE, "Project", NULL, 0, NULL, NULL,
NM_ITEM, "Open...", "O", 0, NULL, (APTR)ID_OPEN,
NM_ITEM, "Save as...", "A", 0, NULL, (APTR)ID_SAVEAS,
NM_ITEM, NM_BARLABEL, NULL, 0, NULL, NULL,
NM_ITEM, "About", "?", 0, NULL, (APTR)ID_ABOUT,
NM_ITEM, NM_BARLABEL, NULL, 0, NULL, NULL,
NM_ITEM, "Quit (Prefs + Server)", "Q", 0, NULL, (APTR)ID_QUIT,
NM_ITEM, "Quit (Prefs)", "H", 0, NULL, (APTR)ID_HIDE,
NM_TITLE, "Settings", NULL, 0, NULL, NULL,
NM_ITEM, "Reset to defaults", "D", 0, NULL, (APTR)ID_RESET,
NM_ITEM, "Last saved", "L", 0, NULL, (APTR)ID_LASTSAVED,
NM_ITEM, "Restore", "R", 0, NULL, (APTR)ID_RESTORE,
NM_END, NULL, NULL, 0, NULL, NULL
};
/**********************************************************************/
/* Display Hook */
/**********************************************************************/
static struct Hook DispViewHook =
{
{NULL},
(APTR)DispViewFunc,
NULL,
NULL
};
static struct Hook DisableHook =
{
{NULL},
(APTR)DisableFunc,
NULL,
NULL
};
static struct Hook PageChangeHook =
{
{NULL},
(APTR)PageChangeFunc,
NULL,
NULL
};
/**********************************************************************/
/* This is our main program */
/**********************************************************************/
ULONG __saveds main(void)
{
struct Process *MyProc;
struct WBStartup *WBenchMsg = NULL;
struct VolEntry *EditEntryPtr = NULL;
struct Window *PosWindow = NULL,
*DrawerWindow = NULL;
ULONG MySig,
ReturnID;
BOOL GoOn = TRUE;
// Get SysBase
SysBase = *((struct ExecBase **)0x4L);
// Get address of our process
MyProc = (struct Process *)FindTask(NULL);
// Determine where we were started from
if(!MyProc->pr_CLI)
{
WaitPort(&MyProc->pr_MsgPort);
WBenchMsg = (struct WBStartup *)GetMsg(&MyProc->pr_MsgPort);
}
// Don`t run under OS < 37
if(((struct Library *)SysBase)->lib_Version >= 37)
{
// Open libraries
if(OpenAll())
{
// Try to find Semaphore
if((FIconSema = FindFIconSema()))
{
// Old version with no AppIcon support running?
if(!FIconSema->FIconSema.ss_Link.ln_Pri)
{
struct Task *ServerTask = FIconSema->ServerTask;
// Server task found?
if(ServerTask)
{
// Release semaphore
RemoveFIconSema(FIconSema);
// Break server program
Signal(ServerTask, SIGBREAKF_CTRL_C);
// Display error
DisplayError(ERR_OLDFICON, NULL);
// Create new semaphore
FIconSema = FindFIconSema();
}
}
}
if(FIconSema)
{
// Check for ToolTypes/commandline options
CheckToolTypes(WBenchMsg);
// Create backups of settings
NewList(&BackUpVolList);
NewList(&BackUpAppList);
if(InitApp() && CloneList(&BackUpVolList, &FIconSema->VolumeList) && CloneList(&BackUpAppList, &FIconSema->AppIconList))
{
while(GoOn)
{
switch(ReturnID = DoMethod(AppObject, MUIM_Application_Input, &MySig))
{
// Handle MAINWINDOW
// Save ?!?!
case ID_SAVE :
{
SavePrefs(FALSE, NULL);
GoOn = FALSE;
break;
}
// Use ?!?!
case ID_USE :
{
SavePrefs(TRUE, NULL);
GoOn = FALSE;
break;
}
// About ???
case ID_ABOUT :
{
DisplayError(ERR_ABOUT, VERNUM, REVNUM, REVDATE, NULL);
break;
}
// Hide/Quit Prefs ?!?
case ID_HIDE :
{
GoOn = FALSE;
break;
}
// Hide/Quit Prefs and server ???
case ID_QUIT :
{
struct Task *ServerTask;
ObtainSemaphore(&FIconSema->FIconSema);
Forbid();
ServerTask = FIconSema->ServerTask;
ReleaseSemaphore(&FIconSema->FIconSema);
// Tell server to go away
if(ServerTask)
Signal(ServerTask, SIGBREAKF_CTRL_C);
Permit();
GoOn = FALSE;
break;
}
// Load prefs?
case ID_OPEN :
{
struct Window *Window;
char FileName[514];
// Create standard filename
strcpy(FileName, "ENV:ForceIcon_prefs.iff");
// Get pointer to main window
get(MainWindow, MUIA_Window_Window, &Window);
if(GetFileName(Window, "Select settings to load...", FileName, 0))
{
// Clear old lists
FreeDevVolList(&FIconSema->VolumeList);
FreeDevVolList(&FIconSema->AppIconList);
DoMethod(UsedList, MUIM_List_Clear, NULL);
DoMethod(AppUsedList, MUIM_List_Clear, NULL);
if(LoadPrefs(FIconSema, FileName))
{
struct VolEntry *ThisEntry;
// Add list of used entries
ObtainSemaphore(&FIconSema->FIconSema);
ThisEntry = (struct VolEntry *)FIconSema->VolumeList.lh_Head;
while(ThisEntry->Link.ln_Succ)
{
DoMethod(UsedList, MUIM_List_InsertSingle, (APTR)ThisEntry, MUIV_List_Insert_Bottom);
ThisEntry = (struct VolEntry *)ThisEntry->Link.ln_Succ;
}
ReleaseSemaphore(&FIconSema->FIconSema);
ObtainSemaphore(&FIconSema->FIconSema);
ThisEntry = (struct VolEntry *)FIconSema->AppIconList.lh_Head;
while(ThisEntry->Link.ln_Succ)
{
DoMethod(AppUsedList, MUIM_List_InsertSingle, (APTR)ThisEntry, MUIV_List_Insert_Bottom);
ThisEntry = (struct VolEntry *)ThisEntry->Link.ln_Succ;
}
ReleaseSemaphore(&FIconSema->FIconSema);
}
}
break;
}
case ID_SAVEAS :
{
struct Window *Window;
char FileName[514];
// Create standard filename
strcpy(FileName, "ENVARC:ForceIcon_prefs.iff");
// Get pointer to main window
get(MainWindow, MUIA_Window_Window, &Window);
if(GetFileName(Window, "Select file to save to...", FileName, 0))
SavePrefs(FALSE, FileName);
break;
}
case ID_RESET :
{
FreeDevVolList(&FIconSema->VolumeList);
FreeDevVolList(&FIconSema->AppIconList);
DoMethod(UsedList, MUIM_List_Clear, NULL);
DoMethod(AppUsedList, MUIM_List_Clear, NULL);
break;
}
case ID_LASTSAVED :
{
FreeDevVolList(&FIconSema->VolumeList);
FreeDevVolList(&FIconSema->AppIconList);
DoMethod(UsedList, MUIM_List_Clear, NULL);
DoMethod(AppUsedList, MUIM_List_Clear, NULL);
if(LoadPrefs(FIconSema, NULL))
{
struct VolEntry *ThisEntry;
// Add list of used entries
ObtainSemaphore(&FIconSema->FIconSema);
ThisEntry = (struct VolEntry *)FIconSema->VolumeList.lh_Head;
while(ThisEntry->Link.ln_Succ)
{
DoMethod(UsedList, MUIM_List_InsertSingle, (APTR)ThisEntry, MUIV_List_Insert_Bottom);
ThisEntry = (struct VolEntry *)ThisEntry->Link.ln_Succ;
}
ReleaseSemaphore(&FIconSema->FIconSema);
ObtainSemaphore(&FIconSema->FIconSema);
ThisEntry = (struct VolEntry *)FIconSema->AppIconList.lh_Head;
while(ThisEntry->Link.ln_Succ)
{
DoMethod(AppUsedList, MUIM_List_InsertSingle, (APTR)ThisEntry, MUIV_List_Insert_Bottom);
ThisEntry = (struct VolEntry *)ThisEntry->Link.ln_Succ;
}
ReleaseSemaphore(&FIconSema->FIconSema);
}
break;
}
case ID_RESTORE :
{
struct VolEntry *ThisEntry;
FreeDevVolList(&FIconSema->VolumeList);
FreeDevVolList(&FIconSema->AppIconList);
DoMethod(UsedList, MUIM_List_Clear, NULL);
DoMethod(AppUsedList, MUIM_List_Clear, NULL);
if(CloneList(&FIconSema->VolumeList, &BackUpVolList) && CloneList(&FIconSema->AppIconList, &BackUpAppList))
{
// Add list of used entries
ObtainSemaphore(&FIconSema->FIconSema);
ThisEntry = (struct VolEntry *)FIconSema->VolumeList.lh_Head;
while(ThisEntry->Link.ln_Succ)
{
DoMethod(UsedList, MUIM_List_InsertSingle, (APTR)ThisEntry, MUIV_List_Insert_Bottom);
ThisEntry = (struct VolEntry *)ThisEntry->Link.ln_Succ;
}
ReleaseSemaphore(&FIconSema->FIconSema);
ObtainSemaphore(&FIconSema->FIconSema);
ThisEntry = (struct VolEntry *)FIconSema->AppIconList.lh_Head;
while(ThisEntry->Link.ln_Succ)
{
DoMethod(AppUsedList, MUIM_List_InsertSingle, (APTR)ThisEntry, MUIV_List_Insert_Bottom);
ThisEntry = (struct VolEntry *)ThisEntry->Link.ln_Succ;
}
ReleaseSemaphore(&FIconSema->FIconSema);
}
}
// Edit entry (Volumes)???
case ID_USEDLIST :
case ID_EDITENTRY :
{
struct VolEntry *ThisEntry;
DoMethod(UsedList, MUIM_List_GetEntry, MUIV_List_GetEntry_Active, &ThisEntry);
if(ThisEntry)
{
set(VolumeName, MUIA_String_Contents, ThisEntry->VolName);
set(VolumeType, MUIA_Cycle_Active, (ThisEntry->Link.ln_Type == LDF_DEVICES));
set(IconPos[0], MUIA_Cycle_Active, ThisEntry->IconPos);
set(IconPos[1], MUIA_Cycle_Active, ThisEntry->IconPos);
set(IconX, MUIA_String_Integer, ThisEntry->Left);
set(IconX, MUIA_Disabled, (ThisEntry->IconPos != MODE_USE));
set(IconY, MUIA_String_Integer, ThisEntry->Top);
set(IconY, MUIA_Disabled, (ThisEntry->IconPos != MODE_USE));
set(Position, MUIA_Cycle_Active, 0);
set(Position, MUIA_Disabled, (ThisEntry->IconPos != MODE_USE));
set(UseIcon[0], MUIA_Cycle_Active, ThisEntry->UseAlt);
set(UseIcon[1], MUIA_Cycle_Active, ThisEntry->UseAlt);
set(IconName, MUIA_String_Contents, ThisEntry->IconName);
set(IconName, MUIA_Disabled, (ThisEntry->UseAlt != MODE_USE));
set(UseWindow[0], MUIA_Cycle_Active, ThisEntry->UseWin);
set(UseWindow[1], MUIA_Cycle_Active, ThisEntry->UseWin);
set(WinX, MUIA_String_Integer, ThisEntry->WinX);
set(WinX, MUIA_Disabled, (ThisEntry->UseWin != MODE_USE));
set(WinY, MUIA_String_Integer, ThisEntry->WinY);
set(WinY, MUIA_Disabled, (ThisEntry->UseWin != MODE_USE));
set(WinWidth, MUIA_String_Integer, ThisEntry->WinWidth);
set(WinWidth, MUIA_Disabled, (ThisEntry->UseWin != MODE_USE));
set(WinHeight, MUIA_String_Integer, ThisEntry->WinHeight);
set(WinHeight, MUIA_Disabled, (ThisEntry->UseWin != MODE_USE));
set(LookWin, MUIA_Cycle_Active, 0);
set(LookWin, MUIA_Disabled, (ThisEntry->UseWin != MODE_USE));
set(UseFlags[0], MUIA_Cycle_Active, ThisEntry->UseFlags);
set(UseFlags[1], MUIA_Cycle_Active, ThisEntry->UseFlags);
set(FlagModes, MUIA_Cycle_Active, ThisEntry->WinFlags);
set(FlagModes, MUIA_Disabled, (ThisEntry->UseFlags != MODE_USE));
set(MainWindow, MUIA_Window_Sleep, TRUE);
set(EditWindow, MUIA_Window_Open, TRUE);
EditEntryPtr = ThisEntry;
}
break;
}
// Edit entry (AppIcons)???
case ID_APPUSEDLIST :
case ID_APPEDITENTRY :
{
struct VolEntry *ThisEntry;
DoMethod(AppUsedList, MUIM_List_GetEntry, MUIV_List_GetEntry_Active, &ThisEntry);
if(ThisEntry)
{
set(AppTaskName, MUIA_String_Contents, ThisEntry->VolName);
set(AppIconPos, MUIA_Cycle_Active, ThisEntry->IconPos);
set(AppIconX, MUIA_String_Integer, ThisEntry->Left);
set(AppIconX, MUIA_Disabled, (ThisEntry->IconPos != MODE_USE));
set(AppIconY, MUIA_String_Integer, ThisEntry->Top);
set(AppIconY, MUIA_Disabled, (ThisEntry->IconPos != MODE_USE));
set(AppPosition, MUIA_Cycle_Active, 0);
set(AppPosition, MUIA_Disabled, (ThisEntry->IconPos != MODE_USE));
set(AppUseIcon, MUIA_Cycle_Active, ThisEntry->UseAlt);
set(AppIconName, MUIA_String_Contents, ThisEntry->IconName);
set(AppIconName, MUIA_Disabled, (ThisEntry->UseAlt != MODE_USE));
set(MainWindow, MUIA_Window_Sleep, TRUE);
set(AppEditWindow, MUIA_Window_Open, TRUE);
EditEntryPtr = ThisEntry;
}
break;
}
// Copy an entry (Volumes)???
case ID_COPYENTRY :
{
struct VolEntry *ThisEntry;
DoMethod(UsedList, MUIM_List_GetEntry, MUIV_List_GetEntry_Active, &ThisEntry);
if(ThisEntry)
{
set(ManVolName, MUIA_String_Contents, ThisEntry->VolName);
set(ManVolType, MUIA_Cycle_Active, (ThisEntry->Link.ln_Type == LDF_DEVICES));
set(MainWindow, MUIA_Window_Sleep, TRUE);
set(ManWindow, MUIA_Window_Title, "Copy entry");
set(ManWindow, MUIA_Window_Open, TRUE);
EditEntryPtr = ThisEntry;
}
break;
}
// Copy an entry (AppIcons)???
case ID_APPCOPYENTRY :
{
struct VolEntry *ThisEntry;
DoMethod(AppUsedList, MUIM_List_GetEntry, MUIV_List_GetEntry_Active, &ThisEntry);
if(ThisEntry)
{
set(AppManTaskName, MUIA_String_Contents, ThisEntry->VolName);
set(MainWindow, MUIA_Window_Sleep, TRUE);
set(AppManWindow, MUIA_Window_Title, "Copy entry");
set(AppManWindow, MUIA_Window_Open, TRUE);
EditEntryPtr = ThisEntry;
}
break;
}
// Remove an entry (Volumes)???
case ID_REMOVEENTRY :
{
struct VolEntry *ThisEntry;
DoMethod(UsedList, MUIM_List_GetEntry, MUIV_List_GetEntry_Active, &ThisEntry);
if(ThisEntry)
{
ObtainSemaphore(&FIconSema->FIconSema);
// Remove entry from listview
DoMethod(UsedList, MUIM_List_Remove, MUIV_List_Remove_Active);
// Remove entry from internal list
Remove(ThisEntry);
FreeVecPool(FIconSema, ThisEntry);
FIconSema->VolumeList.lh_Type--;
ReleaseSemaphore(&FIconSema->FIconSema);
}
break;
}
// Remove an entry (AppIcons)???
case ID_APPREMOVEENTRY :
{
struct VolEntry *ThisEntry;
DoMethod(AppUsedList, MUIM_List_GetEntry, MUIV_List_GetEntry_Active, &ThisEntry);
if(ThisEntry)
{
ObtainSemaphore(&FIconSema->FIconSema);
// Remove entry from listview
DoMethod(AppUsedList, MUIM_List_Remove, MUIV_List_Remove_Active);
// Remove entry from internal list
Remove(ThisEntry);
FreeVecPool(FIconSema, ThisEntry);
FIconSema->AppIconList.lh_Type--;
ReleaseSemaphore(&FIconSema->FIconSema);
}
break;
}
// Add an entry (Volumes) ???
case ID_AVAILLIST :
case ID_ADDENTRY :
{
struct VolEntry *ThisEntry;
// Really get entry ???
DoMethod(AvailList, MUIM_List_GetEntry, MUIV_List_GetEntry_Active, &ThisEntry);
if(ThisEntry)
AddNewVolume(ThisEntry->VolName, ThisEntry->Link.ln_Type, NULL);
break;
}
// Add an entry (AppIcon) ???
case ID_APPAVAILLIST :
case ID_APPADDENTRY :
{
struct VolEntry *ThisEntry;
// Really get entry ???
DoMethod(AppAvailList, MUIM_List_GetEntry, MUIV_List_GetEntry_Active, &ThisEntry);
if(ThisEntry)
AddNewVolume(ThisEntry->VolName, FICON_APPICON, NULL);
break;
}
// Manually add an entry (Volumes)???
case ID_ADDENTRYMAN :
{
set(ManVolName, MUIA_String_Contents, "");
set(ManVolType, MUIA_Cycle_Active, 0);
set(MainWindow, MUIA_Window_Sleep, TRUE);
set(ManWindow, MUIA_Window_Title, "Add manually");
set(ManWindow, MUIA_Window_Open, TRUE);
EditEntryPtr = NULL;
break;
}
// Manually add an entry (AppIcons)???
case ID_APPADDENTRYMAN :
{
set(AppManTaskName, MUIA_String_Contents, "");
set(MainWindow, MUIA_Window_Sleep, TRUE);
set(AppManWindow, MUIA_Window_Title, "Add manually");
set(AppManWindow, MUIA_Window_Open, TRUE);
EditEntryPtr = NULL;
break;
}
// Rescan list (Volumes)???
case ID_RESCANLIST :
{
struct VolEntry *ThisEntry;
// Remove List from listview
DoMethod(AvailList, MUIM_List_Clear, NULL);
// FreeList
FreeDevVolList(&AvailableList);
GetDevVolList(&AvailableList);
// Add list of available entries
ThisEntry = (struct VolEntry *)AvailableList.lh_Head;
while(ThisEntry->Link.ln_Succ)
{
DoMethod(AvailList, MUIM_List_InsertSingle, (APTR)ThisEntry, MUIV_List_Insert_Bottom);
ThisEntry = (struct VolEntry *)ThisEntry->Link.ln_Succ;
}
break;
}
// Rescan list (AppIcons)???
case ID_APPRESCANLIST :
{
struct VolEntry *ThisEntry;
// Remove List from listview
DoMethod(AppAvailList, MUIM_List_Clear, NULL);
// FreeList
FreeDevVolList(&AppAvailableList);
GetTaskList(&AppAvailableList);
// Add list of available entries
ThisEntry = (struct VolEntry *)AppAvailableList.lh_Head;
while(ThisEntry->Link.ln_Succ)
{
DoMethod(AppAvailList, MUIM_List_InsertSingle, (APTR)ThisEntry, MUIV_List_Insert_Bottom);
ThisEntry = (struct VolEntry *)ThisEntry->Link.ln_Succ;
}
break;
}
// Check Edit window
// New input from IconX/Y gadgets?
case ID_ICONX :
case ID_ICONY :
case ID_APPICONX :
case ID_APPICONY :
{
LONG PosX,
PosY;
// Only do, when PosWindow is open, as values
// will be obtained on exit, anyway
if(PosWindow)
{
get((ReturnID == ID_ICONX || ReturnID == ID_ICONY) ? IconX : AppIconX, MUIA_String_Integer, &PosX);
get((ReturnID == ID_ICONX || ReturnID == ID_ICONY) ? IconY : AppIconY, MUIA_String_Integer, &PosY);
ChangeWindowBox(PosWindow, (PosX < 0 ? PosWindow->WScreen->Width + PosX : PosX), (PosY < 0 ? PosWindow->WScreen->Height + PosY : PosY), PosWindow->Width, PosWindow->Height);
}
break;
}
// New input from Drawer Windows?
case ID_WINX :
case ID_WINY :
case ID_WINWIDTH :
case ID_WINHEIGHT :
{
ULONG Left,
Top,
Width,
Height;
if(DrawerWindow)
{
get(WinX, MUIA_String_Integer, &Left);
get(WinY, MUIA_String_Integer, &Top);
get(WinWidth, MUIA_String_Integer, &Width);
get(WinHeight, MUIA_String_Integer, &Height);
ChangeWindowBox(DrawerWindow, Left, Top, Width, Height);
}
break;
}
// Open/Close position window ???
case ID_POSITION :
case ID_APPPOSITION :
{
ULONG State;
get((ReturnID == ID_POSITION ? Position : AppPosition), MUIA_Cycle_Active, &State);
if(State && !PosWindow && EditEntryPtr)
{
struct Screen *WBScreen;
LONG Left,
Top;
get((ReturnID == ID_POSITION ? IconX : AppIconY), MUIA_String_Integer, &Left);
get((ReturnID == ID_POSITION ? IconY : AppIconY), MUIA_String_Integer, &Top);
if((WBScreen = LockPubScreen(NULL)))
{
PosWindow = OpenWindowTags(NULL,
WA_Left, (Left < 0 ? WBScreen->Width + Left : Left),
WA_Top, (Top < 0 ? WBScreen->Height + Top : Top),
WA_Width, (WBScreen->BarLayer->rp->Font->tf_XSize * 4) + 2 + WBScreen->WBorLeft + WBScreen->WBorRight,
WA_Height, WBScreen->WBorTop + WBScreen->Font->ta_YSize + 1,
WA_IDCMP, IDCMP_CHANGEWINDOW,
WA_Flags, WFLG_DRAGBAR|WFLG_RMBTRAP,
WA_Title, "Icon",
WA_PubScreen, WBScreen,
TAG_DONE);
UnlockPubScreen(NULL, WBScreen);
if(!PosWindow)
{
set((ReturnID == ID_POSITION ? Position : AppPosition), MUIA_Cycle_Active, 0);
DisplayError(ERR_NOMEM, NULL);
}
}
}
else if(PosWindow)
{
CloseWindow(PosWindow);
PosWindow = NULL;
}
break;
}
// Open/Close Drawer Window ???
case ID_DRAWER :
{
ULONG State;
get(LookWin, MUIA_Cycle_Active, &State);
if(State && !DrawerWindow && EditEntryPtr)
{
struct Screen *WBScreen;
ULONG Left,
Top,
Width,
Height;
get(WinX, MUIA_String_Integer, &Left);
get(WinY, MUIA_String_Integer, &Top);
get(WinWidth, MUIA_String_Integer, &Width);
get(WinHeight, MUIA_String_Integer, &Height);
if((WBScreen = LockPubScreen(NULL)))
{
DrawerWindow = OpenWindowTags(NULL,
WA_Left, Left,
WA_Top, Top,
WA_Width, (Width ? Width: 50),
WA_Height, (Height ? Height : 50),
WA_MaxWidth, -1,
WA_MaxHeight, -1,
WA_IDCMP, IDCMP_CHANGEWINDOW,
WA_Flags, WFLG_DEPTHGADGET|WFLG_DRAGBAR|WFLG_RMBTRAP|WFLG_SIZEBRIGHT|WFLG_SIZEBBOTTOM,
WA_Title, "Drawer window (demo)",
WA_PubScreen, WBScreen,
WA_SizeGadget, TRUE,
TAG_DONE);
UnlockPubScreen(NULL, WBScreen);
if(!DrawerWindow)
{
set(LookWin, MUIA_Cycle_Active, 0);
DisplayError(ERR_NOMEM, NULL);
}
}
}
else if(DrawerWindow)
{
CloseWindow(DrawerWindow);
DrawerWindow = NULL;
}
break;
}
// Ok (Volumes)???
case ID_EDITOK :
{
ULONG OldType,
NewName,
PopAslState;
BOOL DoSort = FALSE;
// Don`t close window, when FileRequester is open
get(IconName, MUIA_Popasl_Active, &PopAslState);
if(!PopAslState)
{
set(EditWindow, MUIA_Window_Open, FALSE);
if(PosWindow)
{
CloseWindow(PosWindow);
PosWindow = NULL;
}
if(DrawerWindow)
{
CloseWindow(DrawerWindow);
DrawerWindow = NULL;
}
set(MainWindow, MUIA_Window_Sleep, FALSE);
// Copy contents of gadgets to selected entry
if(EditEntryPtr)
{
LONG Dummy;
ObtainSemaphore(&FIconSema->FIconSema);
// Get new settings
get(VolumeName, MUIA_String_Contents, &Dummy);
NewName = stricmp(EditEntryPtr->VolName, (char *)Dummy);
strcpy(EditEntryPtr->VolName, (char *)Dummy);
get(VolumeType, MUIA_Cycle_Active, &Dummy);
OldType = EditEntryPtr->Link.ln_Type;
EditEntryPtr->Link.ln_Type = (Dummy ? LDF_DEVICES : LDF_VOLUMES);
get(IconX, MUIA_String_Integer, &Dummy);
EditEntryPtr->Left = Dummy;
get(IconY, MUIA_String_Integer, &Dummy);
EditEntryPtr->Top = Dummy;
get(IconPos[(UWORD)(EditEntryPtr->Link.ln_Type == LDF_DEVICES)], MUIA_Cycle_Active, &Dummy);
EditEntryPtr->IconPos = Dummy;
get(IconName, MUIA_String_Contents, &Dummy);
strcpy(EditEntryPtr->IconName, (char *)Dummy);
get(UseIcon[(UWORD)(EditEntryPtr->Link.ln_Type == LDF_DEVICES)], MUIA_Cycle_Active, &Dummy);
EditEntryPtr->UseAlt = Dummy;
get(UseWindow[(UWORD)(EditEntryPtr->Link.ln_Type == LDF_DEVICES)], MUIA_Cycle_Active, &Dummy);
EditEntryPtr->UseWin = Dummy;
get(WinX, MUIA_String_Integer, &Dummy);
EditEntryPtr->WinX = Dummy;
get(WinY, MUIA_String_Integer, &Dummy);
EditEntryPtr->WinY = Dummy;
get(WinWidth, MUIA_String_Integer, &Dummy);
EditEntryPtr->WinWidth = Dummy;
get(WinHeight, MUIA_String_Integer, &Dummy);
EditEntryPtr->WinHeight = Dummy;
get(UseFlags[(UWORD)(EditEntryPtr->Link.ln_Type == LDF_DEVICES)], MUIA_Cycle_Active, &Dummy);
EditEntryPtr->UseFlags = Dummy;
get(FlagModes, MUIA_Cycle_Active, &Dummy);
EditEntryPtr->WinFlags = Dummy;
if(!strstr(EditEntryPtr->IconName, ".info") && strlen(EditEntryPtr->IconName))
strcat(EditEntryPtr->IconName, ".info");
// Type of entry changed ???
if(OldType != EditEntryPtr->Link.ln_Type)
{
Remove(EditEntryPtr);
if(EditEntryPtr->Link.ln_Type == LDF_DEVICES)
AddTail(&FIconSema->VolumeList, (struct Node *)EditEntryPtr);
else
AddHead(&FIconSema->VolumeList, (struct Node *)EditEntryPtr);
DoSort = TRUE;
}
// Name changed ???
if(!DoSort)
DoSort = (BOOL)(NewName != 0);
// Rearrange volume`s/device`s icon
DskChange(EditEntryPtr);
// Sort list
if(DoSort)
{
SortList(&FIconSema->VolumeList, TRUE);
// Remove list
DoMethod(UsedList, MUIM_List_Clear, NULL);
EditEntryPtr = (struct VolEntry *)FIconSema->VolumeList.lh_Head;
while(EditEntryPtr->Link.ln_Succ)
{
DoMethod(UsedList, MUIM_List_InsertSingle, (APTR)EditEntryPtr, MUIV_List_Insert_Bottom);
EditEntryPtr = (struct VolEntry *)EditEntryPtr->Link.ln_Succ;
}
}
ReleaseSemaphore(&FIconSema->FIconSema);
}
EditEntryPtr = NULL;
}
break;
}
// Ok (AppIcons)???
case ID_APPEDITOK :
{
ULONG NewName,
PopAslState;
BOOL DoSort = FALSE;
// Don`t close window, when FileRequester is open
get(AppIconName, MUIA_Popasl_Active, &PopAslState);
if(!PopAslState)
{
set(AppEditWindow, MUIA_Window_Open, FALSE);
if(PosWindow)
{
CloseWindow(PosWindow);
PosWindow = NULL;
}
if(DrawerWindow)
{
CloseWindow(DrawerWindow);
DrawerWindow = NULL;
}
set(MainWindow, MUIA_Window_Sleep, FALSE);
// Copy contents of gadgets to selected entry
if(EditEntryPtr)
{
LONG Dummy;
ObtainSemaphore(&FIconSema->FIconSema);
// Get new settings
get(AppTaskName, MUIA_String_Contents, &Dummy);
NewName = stricmp(EditEntryPtr->VolName, (char *)Dummy);
strcpy(EditEntryPtr->VolName, (char *)Dummy);
EditEntryPtr->Link.ln_Type = FICON_APPICON;
get(AppIconX, MUIA_String_Integer, &Dummy);
EditEntryPtr->Left = Dummy;
get(AppIconY, MUIA_String_Integer, &Dummy);
EditEntryPtr->Top = Dummy;
get(AppIconPos, MUIA_Cycle_Active, &Dummy);
EditEntryPtr->IconPos = Dummy;
get(AppIconName, MUIA_String_Contents, &Dummy);
strcpy(EditEntryPtr->IconName, (char *)Dummy);
get(AppUseIcon, MUIA_Cycle_Active, &Dummy);
EditEntryPtr->UseAlt = Dummy;
if(!strstr(EditEntryPtr->IconName, ".info") && strlen(EditEntryPtr->IconName))
strcat(EditEntryPtr->IconName, ".info");
// Name changed ???
if(!DoSort)
DoSort = (BOOL)(NewName != 0);
// Sort list
if(DoSort)
{
SortList(&FIconSema->AppIconList, TRUE);
// Remove list
DoMethod(AppUsedList, MUIM_List_Clear, NULL);
EditEntryPtr = (struct VolEntry *)FIconSema->AppIconList.lh_Head;
while(EditEntryPtr->Link.ln_Succ)
{
DoMethod(AppUsedList, MUIM_List_InsertSingle, (APTR)EditEntryPtr, MUIV_List_Insert_Bottom);
EditEntryPtr = (struct VolEntry *)EditEntryPtr->Link.ln_Succ;
}
}
ReleaseSemaphore(&FIconSema->FIconSema);
}
EditEntryPtr = NULL;
}
break;
}
// Cancel (Volumes/AppIcons)???
case ID_EDITCANCEL :
case ID_APPEDITCANCEL :
{
ULONG PopAslState;
// Don`t close window, when FileRequester is open
get(IconName, MUIA_Popasl_Active, &PopAslState);
if(!PopAslState)
{
set(EditWindow, MUIA_Window_Open, FALSE);
set(AppEditWindow, MUIA_Window_Open, FALSE);
if(PosWindow)
{
CloseWindow(PosWindow);
PosWindow = NULL;
}
if(DrawerWindow)
{
CloseWindow(DrawerWindow);
DrawerWindow = NULL;
}
set(MainWindow, MUIA_Window_Sleep, FALSE);
}
EditEntryPtr = NULL;
break;
}
// Check man window (Volumes)
case ID_MANOK :
{
char *VolName;
ULONG Type;
set(ManWindow, MUIA_Window_Open, FALSE);
set(MainWindow, MUIA_Window_Sleep, FALSE);
get(ManVolName, MUIA_String_Contents, &VolName);
get(ManVolType, MUIA_Cycle_Active, &Type);
Type = (Type ? LDF_DEVICES : LDF_VOLUMES);
AddNewVolume(VolName, Type, EditEntryPtr);
EditEntryPtr = NULL;
break;
}
// Check man window (AppIcons)
case ID_APPMANOK :
{
char *VolName;
set(AppManWindow, MUIA_Window_Open, FALSE);
set(MainWindow, MUIA_Window_Sleep, FALSE);
get(AppManTaskName, MUIA_String_Contents, &VolName);
AddNewVolume(VolName, FICON_APPICON, EditEntryPtr);
EditEntryPtr = NULL;
break;
}
case ID_MANCANCEL :
case ID_APPMANCANCEL :
{
set(ManWindow, MUIA_Window_Open, FALSE);
set(AppManWindow, MUIA_Window_Open, FALSE);
set(MainWindow, MUIA_Window_Sleep, FALSE);
EditEntryPtr = NULL;
break;
}
}
if(GoOn && MySig)
{
if(PosWindow)
MySig |= (1 << PosWindow->UserPort->mp_SigBit);
if(DrawerWindow)
MySig |= (1 << DrawerWindow->UserPort->mp_SigBit);
MySig = Wait(MySig | SIGBREAKF_CTRL_F);
// Server snapped icon?
if(MySig & SIGBREAKF_CTRL_F)
{
struct VolEntry *ThisEntry;
// Entry being displayed?
if(EditEntryPtr)
{
set(IconPos[0], MUIA_Cycle_Active, EditEntryPtr->IconPos);
set(IconPos[1], MUIA_Cycle_Active, EditEntryPtr->IconPos);
set(IconX, MUIA_String_Integer, EditEntryPtr->Left);
set(IconX, MUIA_Disabled, (EditEntryPtr->IconPos != MODE_USE));
set(IconY, MUIA_String_Integer, EditEntryPtr->Top);
set(IconY, MUIA_Disabled, (EditEntryPtr->IconPos != MODE_USE));
set(Position, MUIA_Cycle_Active, 0);
set(Position, MUIA_Disabled, (EditEntryPtr->IconPos != MODE_USE));
if(PosWindow)
CloseWindow(PosWindow);
PosWindow = NULL;
}
// Remove entries from listview (Used)
DoMethod(UsedList, MUIM_List_Clear, NULL);
// Sort the list again
SortList(&FIconSema->VolumeList, TRUE);
// Readd list
ThisEntry = (struct VolEntry *)FIconSema->VolumeList.lh_Head;
while(ThisEntry->Link.ln_Succ)
{
DoMethod(UsedList, MUIM_List_InsertSingle, (APTR)ThisEntry, MUIV_List_Insert_Bottom);
ThisEntry = (struct VolEntry *)ThisEntry->Link.ln_Succ;
}
}
// Check for action on PosWindow
if(PosWindow && (MySig & (1 << PosWindow->UserPort->mp_SigBit)))
{
struct IntuiMessage *MyMsg;
ULONG MsgClass;
LONG OldX,
OldY;
while((MyMsg = (struct IntuiMessage *)GetMsg(PosWindow->UserPort)))
{
MsgClass = MyMsg->Class;
ReplyMsg((struct Message *)MyMsg);
if(MsgClass == IDCMP_CHANGEWINDOW)
{
// Get old position
get(IconX, MUIA_String_Integer, &OldX);
get(IconY, MUIA_String_Integer, &OldY);
set(IconX, MUIA_String_Integer, (OldX < 0 ? PosWindow->LeftEdge - PosWindow->WScreen->Width : PosWindow->LeftEdge));
set(IconY, MUIA_String_Integer, (OldY < 0 ? PosWindow->TopEdge - PosWindow->WScreen->Height : PosWindow->TopEdge));
get(AppIconX, MUIA_String_Integer, &OldX);
get(AppIconY, MUIA_String_Integer, &OldY);
set(AppIconX, MUIA_String_Integer, (OldX < 0 ? PosWindow->LeftEdge - PosWindow->WScreen->Width : PosWindow->LeftEdge));
set(AppIconY, MUIA_String_Integer, (OldY < 0 ? PosWindow->TopEdge - PosWindow->WScreen->Height : PosWindow->TopEdge));
}
}
}
// Check for action on DrawerWindow
if(DrawerWindow && (MySig & (1 << DrawerWindow->UserPort->mp_SigBit)))
{
struct IntuiMessage *MyMsg;
ULONG MsgClass;
while((MyMsg = (struct IntuiMessage *)GetMsg(DrawerWindow->UserPort)))
{
MsgClass = MyMsg->Class;
ReplyMsg((struct Message *)MyMsg);
if(MsgClass == IDCMP_CHANGEWINDOW)
{
set(WinX, MUIA_String_Integer, DrawerWindow->LeftEdge);
set(WinY, MUIA_String_Integer, DrawerWindow->TopEdge);
set(WinWidth, MUIA_String_Integer, DrawerWindow->Width);
set(WinHeight, MUIA_String_Integer, DrawerWindow->Height);
}
}
}
}
}
if(PosWindow)
CloseWindow(PosWindow);
}
RemoveApp();
// Free BackUp lists
FreeDevVolList(&BackUpVolList);
FreeDevVolList(&BackUpAppList);
// Free list of available volumes
FreeDevVolList(&AvailableList);
// Free list of available applications
FreeDevVolList(&AppAvailableList);
}
RemoveFIconSema(FIconSema);
}
}
// Close libs
CloseAll();
// Flush memory when requested
if(FlushMemory)
{
APTR FlushPtr;
int i;
for(i = 0; i < 10; i++)
{
if((FlushPtr = AllocMem(0x1DCD6500, MEMF_PUBLIC)))
FreeMem(FlushPtr, 0x1DCD6500);
}
}
// Send back WBStartUp Message
if(WBenchMsg)
{
Forbid();
ReplyMsg((struct Message *)WBenchMsg);
}
return(0);
}
/**********************************************************************/
/* Functionreplacements */
/**********************************************************************/
void chkabort(void){;}
void __stdargs _XCEXIT(LONG Val){;}
/**********************************************************************/
/* Open libraries */
/**********************************************************************/
static BOOL OpenAll(void)
{
if(!(IntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library", 37)))
{
DisplayError(ERR_OPEN, (ULONG)"intuition.library", 37);
return(FALSE);
}
if(!(MUIMasterBase = OpenLibrary("muimaster.library", 7)))
{
DisplayError(ERR_OPEN, (ULONG)"muimaster.library", 7);
return(FALSE);
}
if(!(DOSBase = (struct DosLibrary *)OpenLibrary("dos.library", 37)))
{
DisplayError(ERR_OPEN, (ULONG)"dos.library", 37);
return(FALSE);
}
if(!(IconBase = OpenLibrary("icon.library", 37)))
{
DisplayError(ERR_OPEN, (ULONG)"icon.library", 37);
return(FALSE);
}
if(!(UtilityBase = OpenLibrary("utility.library", 37)))
{
DisplayError(ERR_OPEN, (ULONG)"utility.library", 37);
return(FALSE);
}
if(!(IFFParseBase = OpenLibrary("iffparse.library", 37)))
{
DisplayError(ERR_OPEN, (ULONG)"iffparse.library", 37);
return(FALSE);
}
if(!(AslBase = OpenLibrary("asl.library", 36)))
{
DisplayError(ERR_OPEN, (ULONG)"asl.library", 36);
return(FALSE);
}
if(!(GfxBase = (struct GfxBase *)OpenLibrary("graphics.library", 37)))
{
DisplayError(ERR_OPEN, (ULONG)"graphics.library", 37);
return(FALSE);
}
return(TRUE);
}
/**********************************************************************/
/* Close libraries */
/**********************************************************************/
static void CloseAll(void)
{
CloseLibrary(MUIMasterBase);
CloseLibrary((struct Library *)GfxBase);
CloseLibrary(AslBase);
CloseLibrary(IFFParseBase);
CloseLibrary(UtilityBase);
CloseLibrary(IconBase);
CloseLibrary((struct Library *)DOSBase);
CloseLibrary((struct Library *)IntuitionBase);
}
/**********************************************************************/
/* Create application */
/**********************************************************************/
static BOOL InitApp(void)
{
// Init list, in case the App can not be created
NewList(&AvailableList);
// Create the Application window
AppObject = ApplicationObject,
MUIA_Application_Title, "ForceIcon",
MUIA_Application_Version, MUIVERS,
MUIA_Application_Copyright, "©1993/94 Kai Iske",
MUIA_Application_Author, "Kai Iske",
MUIA_Application_Description, "Forces Disk.info to image/position",
MUIA_Application_Base, "FIcon",
MUIA_Application_SingleTask, TRUE,
MUIA_Application_DiskObject, DObj = GetDiskObjectNew("PROGDIR:ForceIcon"),
MUIA_HelpFile, "ForceIcon.guide",
// Now head for the main window
SubWindow, MainWindow = WindowObject,
MUIA_Window_Title, "ForceIcon "REVISION" - "REVDATE,
MUIA_Window_ID, 'FIMW',
MUIA_Window_SizeGadget, TRUE,
MUIA_Window_Menu, &MainMenuDef,
MUIA_HelpNode, NODE_MAIN,
// Do the gadgets
WindowContents, VGroup,
Child, RegisterGroup(MainWinPageTitles),
MUIA_Register_Frame, TRUE,
Child, VGroup, // Volume group
// Columns of input
Child, ColGroup(2),
// Create left column
Child, VGroup,
MUIA_HelpNode, NODE_LEFT,
GroupFrameT("Used volumes/devices"),
// Create ListView
Child, UsedList = ListviewObject,
MUIA_Listview_Input, TRUE,
MUIA_Listview_List, ListObject, InputListFrame,
MUIA_Background, MUII_ListBack,
MUIA_List_Format, "COL=0",
MUIA_List_DisplayHook, &DispViewHook,
End,
End,
Child, EditEntry = TextObject, ButtonFrame,
MUIA_Text_Contents, "Edit entry...",
MUIA_Text_PreParse, "\33c",
MUIA_Background, MUII_ButtonBack,
MUIA_InputMode, MUIV_InputMode_RelVerify,
MUIA_Text_HiChar, 'E',
MUIA_ControlChar, 'e',
MUIA_Disabled, TRUE,
End,
Child, CopyEntry = TextObject, ButtonFrame,
MUIA_Text_Contents, "Copy entry...",
MUIA_Text_PreParse, "\33c",
MUIA_Background, MUII_ButtonBack,
MUIA_InputMode, MUIV_InputMode_RelVerify,
MUIA_Text_HiChar, 'p',
MUIA_ControlChar, 'p',
MUIA_Disabled, TRUE,
End,
Child, RemoveEntry = TextObject, ButtonFrame,
MUIA_Text_Contents, "Remove entry",
MUIA_Text_PreParse, "\33c",
MUIA_Background, MUII_ButtonBack,
MUIA_InputMode, MUIV_InputMode_RelVerify,
MUIA_Text_HiChar, 'R',
MUIA_ControlChar, 'r',
MUIA_Disabled, TRUE,
End,
End, // First column
// Create right column
Child, VGroup,
MUIA_HelpNode, NODE_RIGHT,
GroupFrameT("Available volumes/devices"),
// Create ListView
Child, AvailList = ListviewObject,
MUIA_Listview_Input, TRUE,
MUIA_Listview_List, ListObject, InputListFrame,
MUIA_Background, MUII_ListBack,
MUIA_List_Format, "COL=0",
MUIA_List_DisplayHook, &DispViewHook,
End,
End,
Child, AddEntry = TextObject, ButtonFrame,
MUIA_Text_Contents, "Add entry",
MUIA_Text_PreParse, "\33c",
MUIA_Background, MUII_ButtonBack,
MUIA_InputMode, MUIV_InputMode_RelVerify,
MUIA_Text_HiChar, 'd',
MUIA_ControlChar, 'd',
MUIA_Disabled, TRUE,
End,
Child, AddEntryMan = TextObject, ButtonFrame,
MUIA_Text_Contents, "Add manually...",
MUIA_Text_PreParse, "\33c",
MUIA_Background, MUII_ButtonBack,
MUIA_InputMode, MUIV_InputMode_RelVerify,
MUIA_Text_HiChar, 'm',
MUIA_ControlChar, 'm',
End,
Child, RescanList = TextObject, ButtonFrame,
MUIA_Text_Contents, "Rescan list",
MUIA_Text_PreParse, "\33c",
MUIA_Background, MUII_ButtonBack,
MUIA_InputMode, MUIV_InputMode_RelVerify,
MUIA_Text_HiChar, 'l',
MUIA_ControlChar, 'l',
End,
End, // Second column
End, // Columns
End, // Volume/Device Page
Child, VGroup, // AppIcon group
// Columns of input
Child, ColGroup(2),
// Create left column
Child, VGroup,
MUIA_HelpNode, NODE_LEFT,
GroupFrameT("Used applications"),
// Create ListView
Child, AppUsedList = ListviewObject,
MUIA_Listview_Input, TRUE,
MUIA_Listview_List, ListObject, InputListFrame,
MUIA_Background, MUII_ListBack,
MUIA_List_Format, "COL=0",
MUIA_List_DisplayHook, &DispViewHook,
End,
End,
Child, AppEditEntry = TextObject, ButtonFrame,
MUIA_Text_Contents, "Edit entry...",
MUIA_Text_PreParse, "\33c",
MUIA_Background, MUII_ButtonBack,
MUIA_InputMode, MUIV_InputMode_RelVerify,
MUIA_Text_HiChar, 'E',
MUIA_ControlChar, 'e',
MUIA_Disabled, TRUE,
End,
Child, AppCopyEntry = TextObject, ButtonFrame,
MUIA_Text_Contents, "Copy entry...",
MUIA_Text_PreParse, "\33c",
MUIA_Background, MUII_ButtonBack,
MUIA_InputMode, MUIV_InputMode_RelVerify,
MUIA_Text_HiChar, 'p',
MUIA_ControlChar, 'p',
MUIA_Disabled, TRUE,
End,
Child, AppRemoveEntry = TextObject, ButtonFrame,
MUIA_Text_Contents, "Remove entry",
MUIA_Text_PreParse, "\33c",
MUIA_Background, MUII_ButtonBack,
MUIA_InputMode, MUIV_InputMode_RelVerify,
MUIA_Text_HiChar, 'R',
MUIA_ControlChar, 'r',
MUIA_Disabled, TRUE,
End,
End, // First column
// Create right column
Child, VGroup,
MUIA_HelpNode, NODE_RIGHT,
GroupFrameT("Available applications"),
// Create ListView
Child, AppAvailList = ListviewObject,
MUIA_Listview_Input, TRUE,
MUIA_Listview_List, ListObject, InputListFrame,
MUIA_Background, MUII_ListBack,
MUIA_List_Format, "COL=0",
MUIA_List_DisplayHook, &DispViewHook,
End,
End,
Child, AppAddEntry = TextObject, ButtonFrame,
MUIA_Text_Contents, "Add entry",
MUIA_Text_PreParse, "\33c",
MUIA_Background, MUII_ButtonBack,
MUIA_InputMode, MUIV_InputMode_RelVerify,
MUIA_Text_HiChar, 'd',
MUIA_ControlChar, 'd',
MUIA_Disabled, TRUE,
End,
Child, AppAddEntryMan = TextObject, ButtonFrame,
MUIA_Text_Contents, "Add manually...",
MUIA_Text_PreParse, "\33c",
MUIA_Background, MUII_ButtonBack,
MUIA_InputMode, MUIV_InputMode_RelVerify,
MUIA_Text_HiChar, 'm',
MUIA_ControlChar, 'm',
End,
Child, AppRescanList = TextObject, ButtonFrame,
MUIA_Text_Contents, "Rescan list",
MUIA_Text_PreParse, "\33c",
MUIA_Background, MUII_ButtonBack,
MUIA_InputMode, MUIV_InputMode_RelVerify,
MUIA_Text_HiChar, 'l',
MUIA_ControlChar, 'l',
End,
End, // Second column
End, // Columns
End, // AppIcon Page
End, // Page group
Child, VSpace(1),
// Control group
Child, VGroup,
// Create control gadgets
Child, HGroup, MUIA_Group_SameWidth, TRUE,
Child, SaveObj = TextObject, ButtonFrame,
MUIA_Text_Contents, "Save",
MUIA_Text_PreParse, "\33c",
MUIA_Background, MUII_ButtonBack,
MUIA_InputMode, MUIV_InputMode_RelVerify,
MUIA_Text_HiChar, 'S',
MUIA_ControlChar, 's',
End,
Child, UseObj = TextObject, ButtonFrame,
MUIA_Text_Contents, "Use",
MUIA_Text_PreParse, "\33c",
MUIA_Background, MUII_ButtonBack,
MUIA_InputMode, MUIV_InputMode_RelVerify,
MUIA_Text_HiChar, 'U',
MUIA_ControlChar, 'u',
End,
Child, HideObj = TextObject, ButtonFrame,
MUIA_Text_Contents, "Cancel",
MUIA_Text_PreParse, "\33c",
MUIA_Background, MUII_ButtonBack,
MUIA_InputMode, MUIV_InputMode_RelVerify,
MUIA_Text_HiChar, 'C',
MUIA_ControlChar, 'c',
End,
End, // Control panel
End, // Last group
End, // window contents
End, // Main window
// Head for Editwindow
SubWindow, EditWindow = WindowObject,
MUIA_Window_Title, "Edit entry",
MUIA_Window_ID, 'FIEW',
MUIA_Window_SizeGadget, TRUE,
MUIA_Window_NoMenus, TRUE,
MUIA_HelpNode, NODE_EDIT,
WindowContents, VGroup,
// Volume group
Child, VGroup, GroupFrameT("Entry type/name"), MUIA_Group_SameWidth, TRUE,
Child, ColGroup(2),
Child, KeyLabel1("Volume", 'V'),
Child, VolumeName = StringObject, StringFrame,
MUIA_String_Contents, "",
MUIA_String_MaxLen, 128,
MUIA_String_Format, MUIV_String_Format_Left,
MUIA_String_BufferPos, 0,
MUIA_String_Reject, ":/",
MUIA_ControlChar, 'v',
End,
Child, KeyLabel1("Type", 'e'),
Child, VolumeType = KeyCycle(TypeEntries, 'e'),
End,
End, // Volume group
Child, ColGroup(2),
// Position group
Child, VGroup, GroupFrameT("Position settings"), MUIA_Group_SameWidth, TRUE,
Child, ColGroup(2),
Child, KeyLabel1("IconPos", 's'),
Child, IconPosGroup = PageGroup,
Child, IconPos[0] = CycleObject, ButtonFrame,
MUIA_Cycle_Active, 0,
MUIA_Cycle_Entries, ModeEntriesVol,
MUIA_ControlChar, 's',
End,
Child, IconPos[1] = CycleObject, ButtonFrame,
MUIA_Cycle_Active, 0,
MUIA_Cycle_Entries, ModeEntriesDev,
MUIA_ControlChar, 's',
End,
End,
Child, KeyLabel1("Current X", 'X'),
Child, HGroup,
Child, IconX = StringObject, StringFrame,
MUIA_String_Contents, "",
MUIA_String_MaxLen, 7,
MUIA_String_Format, MUIV_String_Format_Center,
MUIA_String_BufferPos, 1,
MUIA_String_Integer, TRUE,
MUIA_ControlChar, 'x',
End,
Child, KeyLabel1("Current Y", 'Y'),
Child, IconY = StringObject, StringFrame,
MUIA_String_Contents, "",
MUIA_String_MaxLen, 7,
MUIA_String_Format, MUIV_String_Format_Center,
MUIA_String_BufferPos, 1,
MUIA_String_Integer, TRUE,
MUIA_ControlChar, 'y',
End,
End,
Child, KeyLabel1("Position", 'P'),
Child, Position = CycleObject, ButtonFrame,
MUIA_Cycle_Active, 0,
MUIA_Cycle_Entries, PositionEntries,
MUIA_ControlChar, 'p',
End,
End,
End, // position group
// Icon group
Child, VGroup, GroupFrameT("Icon settings"), MUIA_Group_SameWidth, TRUE,
Child, VSpace(0),
Child, ColGroup(2),
Child, KeyLabel1("Use Icon", 'U'),
Child, UseIconGroup = PageGroup,
Child, UseIcon[0] = CycleObject, ButtonFrame,
MUIA_Cycle_Active, 0,
MUIA_Cycle_Entries, ModeEntriesVol,
MUIA_ControlChar, 'u',
End,
Child, UseIcon[1] = CycleObject, ButtonFrame,
MUIA_Cycle_Active, 0,
MUIA_Cycle_Entries, ModeEntriesDev,
MUIA_ControlChar, 'u',
End,
End,
Child, KeyLabel1("Icon", 'I'),
Child, IconName = PopaslObject,
MUIA_Popstring_String, KeyString(0, 254, 'i'),
MUIA_Popstring_Button, PopButton(MUII_PopFile),
MUIA_Popasl_Type, ASL_FileRequest,
ASLFR_TitleText, "Please select an icon...",
End,
End,
Child, VSpace(0),
End, // Icon group
End,
// Create window group
Child, VGroup, GroupFrameT("Window settings"), MUIA_Group_SameWidth, TRUE,
Child, ColGroup(2),
Child, KeyLabel1("Use window", 'd'),
Child, UseWindowGroup = PageGroup,
Child, UseWindow[0] = CycleObject, ButtonFrame,
MUIA_Cycle_Active, 0,
MUIA_Cycle_Entries, ModeEntriesVol,
MUIA_ControlChar, 'd',
End,
Child, UseWindow[1] = CycleObject, ButtonFrame,
MUIA_Cycle_Active, 0,
MUIA_Cycle_Entries, ModeEntriesDev,
MUIA_ControlChar, 'd',
End,
End,
Child, KeyLabel2("Left", 'L'),
Child, HGroup,
Child, WinX = StringObject, StringFrame,
MUIA_String_Contents, "",
MUIA_String_MaxLen, 5,
MUIA_String_Format, MUIV_String_Format_Center,
MUIA_String_BufferPos, 1,
MUIA_String_Integer, TRUE,
MUIA_ControlChar, 'l',
End,
Child, KeyLabel1("Top", 'T'),
Child, WinY = StringObject, StringFrame,
MUIA_String_Contents, "",
MUIA_String_MaxLen, 5,
MUIA_String_Format, MUIV_String_Format_Center,
MUIA_String_BufferPos, 1,
MUIA_String_Integer, TRUE,
MUIA_ControlChar, 't',
End,
Child, KeyLabel2("Width", 'W'),
Child, WinWidth = StringObject, StringFrame,
MUIA_String_Contents, "",
MUIA_String_MaxLen, 5,
MUIA_String_Format, MUIV_String_Format_Center,
MUIA_String_BufferPos, 1,
MUIA_String_Integer, TRUE,
MUIA_ControlChar, 'h',
End,
Child, KeyLabel1("Height", 'H'),
Child, WinHeight = StringObject, StringFrame,
MUIA_String_Contents, "",
MUIA_String_MaxLen, 5,
MUIA_String_Format, MUIV_String_Format_Center,
MUIA_String_BufferPos, 1,
MUIA_String_Integer, TRUE,
MUIA_ControlChar, 'w',
End,
End,
Child, KeyLabel1("Window", 'n'),
Child, LookWin = CycleObject, ButtonFrame,
MUIA_Cycle_Active, 0,
MUIA_Cycle_Entries, LookWinEntries,
MUIA_ControlChar, 'n',
End,
Child, KeyLabel1("Use flags", 'f'),
Child, UseFlagsGroup = PageGroup,
Child, UseFlags[0] = CycleObject, ButtonFrame,
MUIA_Cycle_Active, 0,
MUIA_Cycle_Entries, ModeEntriesVol,
MUIA_ControlChar, 'f',
End,
Child, UseFlags[1] = CycleObject, ButtonFrame,
MUIA_Cycle_Active, 0,
MUIA_Cycle_Entries, ModeEntriesDev,
MUIA_ControlChar, 'f',
End,
End,
Child, KeyLabel1("Flags", 'g'),
Child, FlagModes = CycleObject, ButtonFrame,
MUIA_Cycle_Active, 0,
MUIA_Cycle_Entries, FlagModesEntries,
MUIA_ControlChar, 'g',
End,
End,
End, // window group
Child, VSpace(1),
// Create control gadgets
Child, HGroup, MUIA_Group_SameWidth, TRUE,
Child, EditOkObj = TextObject, ButtonFrame,
MUIA_Text_Contents, "Ok",
MUIA_Text_PreParse, "\33c",
MUIA_Background, MUII_ButtonBack,
MUIA_InputMode, MUIV_InputMode_RelVerify,
MUIA_Text_HiChar, 'O',
MUIA_ControlChar, 'o',
End,
Child, EditCancelObj = TextObject, ButtonFrame,
MUIA_Text_Contents, "Cancel",
MUIA_Text_PreParse, "\33c",
MUIA_Background, MUII_ButtonBack,
MUIA_InputMode, MUIV_InputMode_RelVerify,
MUIA_Text_HiChar, 'C',
MUIA_ControlChar, 'c',
End,
End, // Control gadgets
End, // Edit contents
End, // AppIcon Edit window
// Head for AppIcon Editwindow
SubWindow, AppEditWindow = WindowObject,
MUIA_Window_Title, "Edit entry",
MUIA_Window_ID, 'FIAE',
MUIA_Window_SizeGadget, TRUE,
MUIA_Window_NoMenus, TRUE,
MUIA_HelpNode, NODE_EDIT,
WindowContents, VGroup,
// Taskname group
Child, VGroup, GroupFrameT("Entry name"), MUIA_Group_SameWidth, TRUE,
Child, ColGroup(2),
Child, KeyLabel1("Task", 'T'),
Child, AppTaskName = StringObject, StringFrame,
MUIA_String_Contents, "",
MUIA_String_MaxLen, 128,
MUIA_String_Format, MUIV_String_Format_Left,
MUIA_String_BufferPos, 0,
MUIA_ControlChar, 't',
End,
End,
End, // Taskname group
Child, ColGroup(2),
// Position group
Child, VGroup, GroupFrameT("Position settings"), MUIA_Group_SameWidth, TRUE,
Child, ColGroup(2),
Child, KeyLabel1("IconPos", 's'),
Child, AppIconPos = CycleObject, ButtonFrame,
MUIA_Cycle_Active, 0,
MUIA_Cycle_Entries, ModeEntriesDev,
MUIA_ControlChar, 's',
End,
Child, KeyLabel1("Current X", 'X'),
Child, HGroup,
Child, AppIconX = StringObject, StringFrame,
MUIA_String_Contents, "",
MUIA_String_MaxLen, 7,
MUIA_String_Format, MUIV_String_Format_Center,
MUIA_String_BufferPos, 1,
MUIA_String_Integer, TRUE,
MUIA_ControlChar, 'x',
End,
Child, KeyLabel1("Current Y", 'Y'),
Child, AppIconY = StringObject, StringFrame,
MUIA_String_Contents, "",
MUIA_String_MaxLen, 7,
MUIA_String_Format, MUIV_String_Format_Center,
MUIA_String_BufferPos, 1,
MUIA_String_Integer, TRUE,
MUIA_ControlChar, 'y',
End,
End,
Child, KeyLabel1("Position", 'P'),
Child, AppPosition = CycleObject, ButtonFrame,
MUIA_Cycle_Active, 0,
MUIA_Cycle_Entries, PositionEntries,
MUIA_ControlChar, 'p',
End,
End,
End, // position group
// Icon group
Child, VGroup, GroupFrameT("Icon settings"), MUIA_Group_SameWidth, TRUE,
Child, VSpace(0),
Child, ColGroup(2),
Child, KeyLabel1("Use Icon", 'U'),
Child, AppUseIcon = CycleObject, ButtonFrame,
MUIA_Cycle_Active, 0,
MUIA_Cycle_Entries, ModeEntriesDev,
MUIA_ControlChar, 'u',
End,
Child, KeyLabel1("Icon", 'I'),
Child, AppIconName = PopaslObject,
MUIA_Popstring_String, KeyString(0, 254, 'i'),
MUIA_Popstring_Button, PopButton(MUII_PopFile),
MUIA_Popasl_Type, ASL_FileRequest,
ASLFR_TitleText, "Please select an icon...",
End,
End,
Child, VSpace(0),
End, // Icon group
End,
Child, VSpace(1),
// Create control gadgets
Child, HGroup, MUIA_Group_SameWidth, TRUE,
Child, AppEditOkObj = TextObject, ButtonFrame,
MUIA_Text_Contents, "Ok",
MUIA_Text_PreParse, "\33c",
MUIA_Background, MUII_ButtonBack,
MUIA_InputMode, MUIV_InputMode_RelVerify,
MUIA_Text_HiChar, 'O',
MUIA_ControlChar, 'o',
End,
Child, AppEditCancelObj = TextObject, ButtonFrame,
MUIA_Text_Contents, "Cancel",
MUIA_Text_PreParse, "\33c",
MUIA_Background, MUII_ButtonBack,
MUIA_InputMode, MUIV_InputMode_RelVerify,
MUIA_Text_HiChar, 'C',
MUIA_ControlChar, 'c',
End,
End, // Control gadgets
End, // Edit contents
End, // Edit window
// Head for "manually" window
SubWindow, ManWindow = WindowObject,
MUIA_Window_Title, "",
MUIA_Window_ID, 'FINW',
MUIA_Window_SizeGadget, TRUE,
MUIA_Window_NoMenus, TRUE,
MUIA_HelpNode, NODE_MANUAL,
WindowContents, VGroup,
Child, VGroup, GroupFrameT("Entry type/name"),
// String gadget
Child, ColGroup(2),
Child, KeyLabel1("Volume", 'V'),
Child, ManVolName = StringObject, StringFrame,
MUIA_String_Contents, "",
MUIA_String_MaxLen, 128,
MUIA_String_Format, MUIV_String_Format_Left,
MUIA_String_BufferPos, 1,
MUIA_String_Reject, ":/",
MUIA_ControlChar, 'v',
End,
Child, KeyLabel1("Type", 'T'),
Child, ManVolType = KeyCycle(TypeEntries, 't'),
End,
End,
Child, VSpace(1),
// Control gadgets
Child, HGroup, MUIA_Group_SameWidth, TRUE,
Child, ManOkObj = TextObject, ButtonFrame,
MUIA_Text_Contents, "Ok",
MUIA_Text_PreParse, "\33c",
MUIA_Background, MUII_ButtonBack,
MUIA_InputMode, MUIV_InputMode_RelVerify,
MUIA_Text_HiChar, 'O',
MUIA_ControlChar, 'o',
End,
Child, ManCancelObj = TextObject, ButtonFrame,
MUIA_Text_Contents, "Cancel",
MUIA_Text_PreParse, "\33c",
MUIA_Background, MUII_ButtonBack,
MUIA_InputMode, MUIV_InputMode_RelVerify,
MUIA_Text_HiChar, 'C',
MUIA_ControlChar, 'c',
End,
End, // Control gadgets
End, // Man contents
End, // Man window
// Head for "manually" window (AppIcons)
SubWindow, AppManWindow = WindowObject,
MUIA_Window_Title, "",
MUIA_Window_ID, 'FINW',
MUIA_Window_SizeGadget, TRUE,
MUIA_Window_NoMenus, TRUE,
MUIA_HelpNode, NODE_MANUAL,
WindowContents, VGroup,
Child, VGroup, GroupFrameT("Entry type/name"),
// String gadget
Child, ColGroup(2),
Child, KeyLabel1("Taskname", 'T'),
Child, AppManTaskName = StringObject, StringFrame,
MUIA_String_Contents, "",
MUIA_String_MaxLen, 128,
MUIA_String_Format, MUIV_String_Format_Left,
MUIA_String_BufferPos, 1,
MUIA_String_Reject, ":/",
MUIA_ControlChar, 't',
End,
End,
End,
Child, VSpace(1),
// Control gadgets
Child, HGroup, MUIA_Group_SameWidth, TRUE,
Child, AppManOkObj = TextObject, ButtonFrame,
MUIA_Text_Contents, "Ok",
MUIA_Text_PreParse, "\33c",
MUIA_Background, MUII_ButtonBack,
MUIA_InputMode, MUIV_InputMode_RelVerify,
MUIA_Text_HiChar, 'O',
MUIA_ControlChar, 'o',
End,
Child, AppManCancelObj = TextObject, ButtonFrame,
MUIA_Text_Contents, "Cancel",
MUIA_Text_PreParse, "\33c",
MUIA_Background, MUII_ButtonBack,
MUIA_InputMode, MUIV_InputMode_RelVerify,
MUIA_Text_HiChar, 'C',
MUIA_ControlChar, 'c',
End,
End, // Control gadgets
End, // Man contents
End, // Man window
End; // End application
// Appobject there and got a list of available entries ???
if(AppObject && GetDevVolList(&AvailableList) && GetTaskList(&AppAvailableList))
{
struct VolEntry *ThisEntry;
int i;
// Main window settings
// SetCycle chain
DoMethod(MainWindow, MUIM_Window_SetCycleChain,
UsedList,
AvailList,
EditEntry,
CopyEntry,
RemoveEntry,
AddEntry,
AddEntryMan,
RescanList,
AppUsedList,
AppAvailList,
AppEditEntry,
AppCopyEntry,
AppRemoveEntry,
AppAddEntry,
AppAddEntryMan,
AppRescanList,
SaveObj,
UseObj,
HideObj,
NULL);
// Set default object
set(MainWindow, MUIA_Window_DefaultObject, AvailList);
// Set notifications
DoMethod(MainWindow, MUIM_Notify,
MUIA_Window_CloseRequest, TRUE,
AppObject, 2,
MUIM_Application_ReturnID, ID_HIDE);
// Set IDs for gadgets
DoMethod(UsedList, MUIM_Notify,
MUIA_Listview_DoubleClick, TRUE,
AppObject, 2,
MUIM_Application_ReturnID, ID_USEDLIST);
DoMethod(EditEntry, MUIM_Notify,
MUIA_Pressed, FALSE,
AppObject, 2,
MUIM_Application_ReturnID, ID_EDITENTRY);
DoMethod(CopyEntry, MUIM_Notify,
MUIA_Pressed, FALSE,
AppObject, 2,
MUIM_Application_ReturnID, ID_COPYENTRY);
DoMethod(RemoveEntry, MUIM_Notify,
MUIA_Pressed, FALSE,
AppObject, 2,
MUIM_Application_ReturnID, ID_REMOVEENTRY);
DoMethod(AvailList, MUIM_Notify,
MUIA_Listview_DoubleClick, TRUE,
AppObject, 2,
MUIM_Application_ReturnID, ID_AVAILLIST);
DoMethod(AddEntry, MUIM_Notify,
MUIA_Pressed, FALSE,
AppObject, 2,
MUIM_Application_ReturnID, ID_ADDENTRY);
DoMethod(AddEntryMan, MUIM_Notify,
MUIA_Pressed, FALSE,
AppObject, 2,
MUIM_Application_ReturnID, ID_ADDENTRYMAN);
DoMethod(RescanList, MUIM_Notify,
MUIA_Pressed, FALSE,
AppObject, 2,
MUIM_Application_ReturnID, ID_RESCANLIST);
DoMethod(AppUsedList, MUIM_Notify,
MUIA_Listview_DoubleClick, TRUE,
AppObject, 2,
MUIM_Application_ReturnID, ID_APPUSEDLIST);
DoMethod(AppEditEntry, MUIM_Notify,
MUIA_Pressed, FALSE,
AppObject, 2,
MUIM_Application_ReturnID, ID_APPEDITENTRY);
DoMethod(AppCopyEntry, MUIM_Notify,
MUIA_Pressed, FALSE,
AppObject, 2,
MUIM_Application_ReturnID, ID_APPCOPYENTRY);
DoMethod(AppRemoveEntry, MUIM_Notify,
MUIA_Pressed, FALSE,
AppObject, 2,
MUIM_Application_ReturnID, ID_APPREMOVEENTRY);
DoMethod(AppAvailList, MUIM_Notify,
MUIA_Listview_DoubleClick, TRUE,
AppObject, 2,
MUIM_Application_ReturnID, ID_APPAVAILLIST);
DoMethod(AppAddEntry, MUIM_Notify,
MUIA_Pressed, FALSE,
AppObject, 2,
MUIM_Application_ReturnID, ID_APPADDENTRY);
DoMethod(AppAddEntryMan, MUIM_Notify,
MUIA_Pressed, FALSE,
AppObject, 2,
MUIM_Application_ReturnID, ID_APPADDENTRYMAN);
DoMethod(AppRescanList, MUIM_Notify,
MUIA_Pressed, FALSE,
AppObject, 2,
MUIM_Application_ReturnID, ID_APPRESCANLIST);
DoMethod(SaveObj, MUIM_Notify,
MUIA_Pressed, FALSE,
AppObject, 2,
MUIM_Application_ReturnID, ID_SAVE);
DoMethod(UseObj, MUIM_Notify,
MUIA_Pressed, FALSE,
AppObject, 2,
MUIM_Application_ReturnID, ID_USE);
DoMethod(HideObj, MUIM_Notify,
MUIA_Pressed, FALSE,
AppObject, 2,
MUIM_Application_ReturnID, ID_HIDE);
// Set disable notify-hooks
DoMethod(UsedList, MUIM_Notify,
MUIA_List_Active, MUIV_EveryTime,
AppObject, 3,
MUIM_CallHook, &DisableHook, UsedList);
DoMethod(AvailList, MUIM_Notify,
MUIA_List_Active, MUIV_EveryTime,
AppObject, 3,
MUIM_CallHook, &DisableHook, AvailList);
DoMethod(AppUsedList, MUIM_Notify,
MUIA_List_Active, MUIV_EveryTime,
AppObject, 3,
MUIM_CallHook, &DisableHook, AppUsedList);
DoMethod(AppAvailList, MUIM_Notify,
MUIA_List_Active, MUIV_EveryTime,
AppObject, 3,
MUIM_CallHook, &DisableHook, AppAvailList);
// Edit window settings (Volumes)
// Set cycle chain
DoMethod(EditWindow, MUIM_Window_SetCycleChain,
VolumeName,
VolumeType,
IconPos[0],
IconPos[1],
IconX,
IconY,
Position,
UseIcon[0],
UseIcon[1],
IconName,
UseWindow[0],
UseWindow[1],
WinX,
WinY,
WinWidth,
WinHeight,
UseFlags[0],
UseFlags[1],
FlagModes,
EditOkObj,
EditCancelObj,
NULL);
// Set notifications
DoMethod(EditWindow, MUIM_Notify,
MUIA_Window_CloseRequest, TRUE,
AppObject, 2,
MUIM_Application_ReturnID, ID_EDITCANCEL);
DoMethod(EditOkObj, MUIM_Notify,
MUIA_Pressed, FALSE,
AppObject, 2,
MUIM_Application_ReturnID, ID_EDITOK);
DoMethod(EditCancelObj, MUIM_Notify,
MUIA_Pressed, FALSE,
AppObject, 2,
MUIM_Application_ReturnID, ID_EDITCANCEL);
DoMethod(Position, MUIM_Notify,
MUIA_Cycle_Active, MUIV_EveryTime,
AppObject, 2,
MUIM_Application_ReturnID, ID_POSITION);
DoMethod(LookWin, MUIM_Notify,
MUIA_Cycle_Active, MUIV_EveryTime,
AppObject, 2,
MUIM_Application_ReturnID, ID_DRAWER);
DoMethod(IconX, MUIM_Notify,
MUIA_String_Acknowledge, MUIV_EveryTime,
AppObject, 2,
MUIM_Application_ReturnID, ID_ICONX);
DoMethod(IconY, MUIM_Notify,
MUIA_String_Acknowledge, MUIV_EveryTime,
AppObject, 2,
MUIM_Application_ReturnID, ID_ICONY);
DoMethod(WinX, MUIM_Notify,
MUIA_String_Acknowledge, MUIV_EveryTime,
AppObject, 2,
MUIM_Application_ReturnID, ID_WINX);
DoMethod(WinY, MUIM_Notify,
MUIA_String_Acknowledge, MUIV_EveryTime,
AppObject, 2,
MUIM_Application_ReturnID, ID_WINY);
DoMethod(WinWidth, MUIM_Notify,
MUIA_String_Acknowledge, MUIV_EveryTime,
AppObject, 2,
MUIM_Application_ReturnID, ID_WINWIDTH);
DoMethod(WinHeight, MUIM_Notify,
MUIA_String_Acknowledge, MUIV_EveryTime,
AppObject, 2,
MUIM_Application_ReturnID, ID_WINHEIGHT);
DoMethod(VolumeType, MUIM_Notify,
MUIA_Cycle_Active, MUIV_EveryTime,
IconPosGroup, 3,
MUIM_Set, MUIA_Group_ActivePage, MUIV_TriggerValue);
DoMethod(VolumeType, MUIM_Notify,
MUIA_Cycle_Active, MUIV_EveryTime,
AppObject, 2,
MUIM_CallHook, &PageChangeHook);
DoMethod(VolumeType, MUIM_Notify,
MUIA_Cycle_Active, MUIV_EveryTime,
UseIconGroup, 3,
MUIM_Set, MUIA_Group_ActivePage, MUIV_TriggerValue);
DoMethod(VolumeType, MUIM_Notify,
MUIA_Cycle_Active, MUIV_EveryTime,
UseWindowGroup, 3,
MUIM_Set, MUIA_Group_ActivePage, MUIV_TriggerValue);
DoMethod(VolumeType, MUIM_Notify,
MUIA_Cycle_Active, MUIV_EveryTime,
UseFlagsGroup, 3,
MUIM_Set, MUIA_Group_ActivePage, MUIV_TriggerValue);
for(i = 0; i < 2; i++)
{
DoMethod(IconPos[i], MUIM_Notify,
MUIA_Cycle_Active, MUIV_EveryTime,
AppObject, 3,
MUIM_CallHook, &DisableHook, IconPos[i]);
DoMethod(UseIcon[i], MUIM_Notify,
MUIA_Cycle_Active, MUIV_EveryTime,
AppObject, 3,
MUIM_CallHook, &DisableHook, UseIcon[i]);
DoMethod(UseWindow[i], MUIM_Notify,
MUIA_Cycle_Active, MUIV_EveryTime,
AppObject, 3,
MUIM_CallHook, &DisableHook, UseWindow[i]);
DoMethod(UseFlags[i], MUIM_Notify,
MUIA_Cycle_Active, MUIV_EveryTime,
AppObject, 3,
MUIM_CallHook, &DisableHook, UseFlags[i]);
}
// Edit window settings (AppIcon)
// Set cycle chain
DoMethod(AppEditWindow, MUIM_Window_SetCycleChain,
AppTaskName,
AppIconPos,
AppIconX,
AppIconY,
AppPosition,
AppUseIcon,
AppIconName,
AppEditOkObj,
AppEditCancelObj,
NULL);
// Set notifications
DoMethod(AppEditWindow, MUIM_Notify,
MUIA_Window_CloseRequest, TRUE,
AppObject, 2,
MUIM_Application_ReturnID, ID_APPEDITCANCEL);
DoMethod(AppEditOkObj, MUIM_Notify,
MUIA_Pressed, FALSE,
AppObject, 2,
MUIM_Application_ReturnID, ID_APPEDITOK);
DoMethod(AppEditCancelObj, MUIM_Notify,
MUIA_Pressed, FALSE,
AppObject, 2,
MUIM_Application_ReturnID, ID_APPEDITCANCEL);
DoMethod(AppPosition, MUIM_Notify,
MUIA_Cycle_Active, MUIV_EveryTime,
AppObject, 2,
MUIM_Application_ReturnID, ID_APPPOSITION);
DoMethod(AppIconX, MUIM_Notify,
MUIA_String_Acknowledge, MUIV_EveryTime,
AppObject, 2,
MUIM_Application_ReturnID, ID_APPICONX);
DoMethod(AppIconY, MUIM_Notify,
MUIA_String_Acknowledge, MUIV_EveryTime,
AppObject, 2,
MUIM_Application_ReturnID, ID_APPICONY);
DoMethod(AppIconPos, MUIM_Notify,
MUIA_Cycle_Active, MUIV_EveryTime,
AppObject, 3,
MUIM_CallHook, &DisableHook, AppIconPos);
DoMethod(AppUseIcon, MUIM_Notify,
MUIA_Cycle_Active, MUIV_EveryTime,
AppObject, 3,
MUIM_CallHook, &DisableHook, AppUseIcon);
// Man window settings (Volumes)
// Set cycle chaing
DoMethod(ManWindow, MUIM_Window_SetCycleChain,
ManVolName,
ManVolType,
ManOkObj,
ManCancelObj,
NULL);
// Set notifications
DoMethod(ManWindow, MUIM_Notify,
MUIA_Window_CloseRequest, TRUE,
AppObject, 2,
MUIM_Application_ReturnID, ID_MANCANCEL);
DoMethod(ManOkObj, MUIM_Notify,
MUIA_Pressed, FALSE,
AppObject, 2,
MUIM_Application_ReturnID, ID_MANOK);
DoMethod(ManCancelObj, MUIM_Notify,
MUIA_Pressed, FALSE,
AppObject, 2,
MUIM_Application_ReturnID, ID_MANCANCEL);
// Man window settings (AppIcons)
// Set cycle chaing
DoMethod(AppManWindow, MUIM_Window_SetCycleChain,
AppManTaskName,
AppManOkObj,
AppManCancelObj,
NULL);
// Set notifications
DoMethod(AppManWindow, MUIM_Notify,
MUIA_Window_CloseRequest, TRUE,
AppObject, 2,
MUIM_Application_ReturnID, ID_APPMANCANCEL);
DoMethod(AppManOkObj, MUIM_Notify,
MUIA_Pressed, FALSE,
AppObject, 2,
MUIM_Application_ReturnID, ID_APPMANOK);
DoMethod(AppManCancelObj, MUIM_Notify,
MUIA_Pressed, FALSE,
AppObject, 2,
MUIM_Application_ReturnID, ID_APPMANCANCEL);
// Add list of used entries
ObtainSemaphore(&FIconSema->FIconSema);
ThisEntry = (struct VolEntry *)FIconSema->VolumeList.lh_Head;
while(ThisEntry->Link.ln_Succ)
{
DoMethod(UsedList, MUIM_List_InsertSingle, (APTR)ThisEntry, MUIV_List_Insert_Bottom);
ThisEntry = (struct VolEntry *)ThisEntry->Link.ln_Succ;
}
ReleaseSemaphore(&FIconSema->FIconSema);
ObtainSemaphore(&FIconSema->FIconSema);
ThisEntry = (struct VolEntry *)FIconSema->AppIconList.lh_Head;
while(ThisEntry->Link.ln_Succ)
{
DoMethod(AppUsedList, MUIM_List_InsertSingle, (APTR)ThisEntry, MUIV_List_Insert_Bottom);
ThisEntry = (struct VolEntry *)ThisEntry->Link.ln_Succ;
}
ReleaseSemaphore(&FIconSema->FIconSema);
// Add list of available entries
ThisEntry = (struct VolEntry *)AvailableList.lh_Head;
while(ThisEntry->Link.ln_Succ)
{
DoMethod(AvailList, MUIM_List_InsertSingle, (APTR)ThisEntry, MUIV_List_Insert_Bottom);
ThisEntry = (struct VolEntry *)ThisEntry->Link.ln_Succ;
}
ThisEntry = (struct VolEntry *)AppAvailableList.lh_Head;
while(ThisEntry->Link.ln_Succ)
{
DoMethod(AppAvailList, MUIM_List_InsertSingle, (APTR)ThisEntry, MUIV_List_Insert_Bottom);
ThisEntry = (struct VolEntry *)ThisEntry->Link.ln_Succ;
}
// Open main window
set(MainWindow, MUIA_Window_Open, TRUE);
}
else
{
if(MUI_Error() != MUIE_SingleTask)
DisplayError(ERR_NO_APP, NULL);
}
return((BOOL)(AppObject != NULL));
}
/**********************************************************************/
/* Remove our application */
/**********************************************************************/
static void RemoveApp(void)
{
if(AppObject)
{
set(MainWindow, MUIA_Window_Open, FALSE);
MUI_DisposeObject(AppObject);
}
// Dispose DiskObject
if(DObj)
FreeDiskObject(DObj);
}
/**********************************************************************/
/* Display function */
/**********************************************************************/
static ULONG __saveds __asm DispViewFunc(register __a0 struct Hook *MyHook, register __a2 char **array, register __a1 struct VolEntry *Data)
{
static char Buffer[140];
if(Data->Link.ln_Type == LDF_VOLUMES)
{
strcpy(Buffer, "\0338");
strcat(Buffer, Data->VolName);
}
else
strcpy(Buffer, Data->VolName);
*array = Buffer;
return(NULL);
}
/**********************************************************************/
/* Hook for setting gadgetstates */
/**********************************************************************/
static ULONG __saveds __asm DisableFunc(register __a0 struct Hook *MyHook, register __a2 APTR Obj, register __a1 APTR *Data)
{
ULONG State;
if(*Data == UsedList)
{
get(UsedList, MUIA_List_Active, &State);
State = (State == MUIV_List_Active_Off ? TRUE : FALSE);
set(EditEntry, MUIA_Disabled, State);
set(CopyEntry, MUIA_Disabled, State);
set(RemoveEntry, MUIA_Disabled, State);
}
else if(*Data == AppUsedList)
{
get(AppUsedList, MUIA_List_Active, &State);
State = (State == MUIV_List_Active_Off ? TRUE : FALSE);
set(AppEditEntry, MUIA_Disabled, State);
set(AppCopyEntry, MUIA_Disabled, State);
set(AppRemoveEntry, MUIA_Disabled, State);
}
else if(*Data == AvailList)
{
get(AvailList, MUIA_List_Active, &State);
State = (State == MUIV_List_Active_Off ? TRUE : FALSE);
set(AddEntry, MUIA_Disabled, State);
}
else if(*Data == AppAvailList)
{
get(AppAvailList, MUIA_List_Active, &State);
State = (State == MUIV_List_Active_Off ? TRUE : FALSE);
set(AppAddEntry, MUIA_Disabled, State);
}
else if((*Data == IconPos[0]) || (*Data == IconPos[1]))
{
get(*Data, MUIA_Cycle_Active, &State);
set(IconX, MUIA_Disabled, (State != MODE_USE));
set(IconY, MUIA_Disabled, (State != MODE_USE));
set(Position, MUIA_Disabled, (State != MODE_USE));
}
else if(*Data == AppIconPos)
{
get(*Data, MUIA_Cycle_Active, &State);
set(AppIconX, MUIA_Disabled, (State != MODE_USE));
set(AppIconY, MUIA_Disabled, (State != MODE_USE));
set(AppPosition, MUIA_Disabled, (State != MODE_USE));
}
else if((*Data == UseIcon[0]) || (*Data == UseIcon[1]))
{
get(*Data, MUIA_Cycle_Active, &State);
set(IconName, MUIA_Disabled, (State != MODE_USE));
}
else if(*Data == AppUseIcon)
{
get(AppUseIcon, MUIA_Cycle_Active, &State);
set(AppIconName, MUIA_Disabled, (State != MODE_USE));
}
else if((*Data == UseWindow[0]) || (*Data == UseWindow[1]))
{
get(*Data, MUIA_Cycle_Active, &State);
set(WinX, MUIA_Disabled, (State != MODE_USE));
set(WinY, MUIA_Disabled, (State != MODE_USE));
set(WinWidth, MUIA_Disabled, (State != MODE_USE));
set(WinHeight, MUIA_Disabled, (State != MODE_USE));
set(LookWin, MUIA_Disabled, (State != MODE_USE));
}
else if((*Data == UseFlags[0]) || (*Data == UseFlags[1]))
{
get(*Data, MUIA_Cycle_Active, &State);
set(FlagModes, MUIA_Disabled, (State != MODE_USE));
}
return(0);
}
/**********************************************************************/
/* Change gadget states on settings of cycle gadget (VolumeType) */
/**********************************************************************/
static ULONG __saveds __asm PageChangeFunc(register __a0 struct Hook *MyHook, register __a2 APTR Obj, register __a1 APTR *Data)
{
ULONG Page;
ULONG State;
// Get current page
get(VolumeType, MUIA_Cycle_Active, &Page);
// Set gadget states
get(IconPos[Page], MUIA_Cycle_Active, &State);
set(IconX, MUIA_Disabled, (State != MODE_USE));
set(IconY, MUIA_Disabled, (State != MODE_USE));
set(Position, MUIA_Disabled, (State != MODE_USE));
get(UseIcon[Page], MUIA_Cycle_Active, &State);
set(IconName, MUIA_Disabled, (State != MODE_USE));
get(UseWindow[Page], MUIA_Cycle_Active, &State);
set(WinX, MUIA_Disabled, (State != MODE_USE));
set(WinY, MUIA_Disabled, (State != MODE_USE));
set(WinWidth, MUIA_Disabled, (State != MODE_USE));
set(WinHeight, MUIA_Disabled, (State != MODE_USE));
set(LookWin, MUIA_Disabled, (State != MODE_USE));
get(UseFlags[Page], MUIA_Cycle_Active, &State);
set(FlagModes, MUIA_Disabled, (State != MODE_USE));
return(0);
}
/**********************************************************************/
/* Add a new volumes/device to the used list */
/**********************************************************************/
static struct VolEntry *AddNewVolume(char *Name, ULONG Type, struct VolEntry *CopyPtr)
{
struct List *CheckList = (Type == FICON_APPICON ? &FIconSema->AppIconList : &FIconSema->VolumeList);
struct VolEntry *NewEntry = NULL,
*ThisEntry;
// Check for exitance
if(CheckExists(CheckList, Name))
{
DisplayError(ERR_EXISTS, (ULONG)Name);
return(NewEntry);
}
// Try to get our semaphore
ObtainSemaphore(&FIconSema->FIconSema);
// Get memory for new entry
if((NewEntry = AllocVecPool(FIconSema, sizeof(struct VolEntry))))
{
// One entry plus
CheckList->lh_Type++;
// Add entry and fill out structure
if(Type == LDF_VOLUMES)
AddHead(CheckList, (struct Node *)NewEntry);
else
AddTail(CheckList, (struct Node *)NewEntry);
NewEntry->Link.ln_Name = NewEntry->VolName;
NewEntry->Link.ln_Type = Type;
strcpy(NewEntry->VolName, Name);
// Copy contents of other entry ???
if(CopyPtr)
{
strcpy(NewEntry->IconName, CopyPtr->IconName);
NewEntry->Left = CopyPtr->Left;
NewEntry->Top = CopyPtr->Top;
NewEntry->IconPos = CopyPtr->IconPos;
NewEntry->UseAlt = CopyPtr->UseAlt;
NewEntry->UseWin = CopyPtr->UseWin;
NewEntry->WinX = CopyPtr->WinX;
NewEntry->WinY = CopyPtr->WinY;
NewEntry->WinWidth = CopyPtr->WinWidth;
NewEntry->WinHeight = CopyPtr->WinHeight;
NewEntry->UseFlags = CopyPtr->UseFlags;
NewEntry->WinFlags = CopyPtr->WinFlags;
}
// Remove entries from listview (Used)
DoMethod((Type == FICON_APPICON ? AppUsedList : UsedList), MUIM_List_Clear, NULL);
// Sort the list again
SortList(CheckList, TRUE);
// Readd list
ThisEntry = (struct VolEntry *)CheckList->lh_Head;
while(ThisEntry->Link.ln_Succ)
{
DoMethod((Type == FICON_APPICON ? AppUsedList : UsedList), MUIM_List_InsertSingle, (APTR)ThisEntry, MUIV_List_Insert_Bottom);
ThisEntry = (struct VolEntry *)ThisEntry->Link.ln_Succ;
}
}
else
{
DisplayError(ERR_NOMEM, NULL);
NewEntry = NULL;
}
// Free our semaphore
ReleaseSemaphore(&FIconSema->FIconSema);
return(NewEntry);
}
/**********************************************************************/
/* Check for existance of a volume within the user list */
/**********************************************************************/
static BOOL CheckExists(struct List *CheckList, char *Name)
{
BOOL RetVal = FALSE;
ObtainSemaphore(&FIconSema->FIconSema);
if(!IsListEmpty(CheckList))
{
struct VolEntry *ThisEntry = (struct VolEntry *)CheckList->lh_Head;
do
{
if(!stricmp(ThisEntry->VolName, Name))
RetVal = TRUE;
ThisEntry = (struct VolEntry *)ThisEntry->Link.ln_Succ;
} while(!RetVal && ThisEntry->Link.ln_Succ);
}
ReleaseSemaphore(&FIconSema->FIconSema);
return(RetVal);
}
/**********************************************************************/
/* Save Prefs to disk/env */
/**********************************************************************/
static BOOL DoSavePrefs(char *PrefsName);
static BOOL SavePrefs(BOOL EnvMode, char *ToName)
{
if(ToName)
return(DoSavePrefs(ToName));
else
{
// On ENV: mode, simply save to ENV: only
if(DoSavePrefs("ENV:ForceIcon_prefs.iff"))
{
// Otherwise write to envarc: as well
if(!EnvMode)
return(DoSavePrefs("ENVARC:ForceIcon_prefs.iff"));
else
return(TRUE);
}
}
return(FALSE);
}
static BOOL DoSavePrefs(char *PrefsName)
{
struct IFFHandle *PrefsHandle;
LONG Error;
BOOL GoOn = FALSE;
UWORD VersChunk[] =
{
VERNUM,
REVNUM
};
ObtainSemaphore(&FIconSema->FIconSema);
// Get handle for IFF
if((PrefsHandle = AllocIFF()))
{
// Open file for save
if((PrefsHandle->iff_Stream = Open(PrefsName, MODE_NEWFILE)))
{
// Init Handle
InitIFFasDOS(PrefsHandle);
// Open Handle
if(!(Error = OpenIFF(PrefsHandle, IFFF_WRITE)))
{
// Write FORM chunk
if(!(Error = PushChunk(PrefsHandle, 'FOIC', 'FORM', IFFSIZE_UNKNOWN)))
{
// Write version chunk
if(!(Error = PushChunk(PrefsHandle, 'FOIC', 'VERS', IFFSIZE_UNKNOWN)))
{
if((Error = WriteChunkBytes(PrefsHandle, &VersChunk[0], (sizeof(UWORD) * 2))) == (sizeof(UWORD) * 2))
Error = PopChunk(PrefsHandle);
else
Error = IoErr();
}
// Write Prefs chunk
if(!Error && !(Error = PushChunk(PrefsHandle, 'FOIC', 'PREF', IFFSIZE_UNKNOWN)))
{
struct VolEntry *ThisEntry;
UWORD NumEntriesVol = FIconSema->VolumeList.lh_Type,
NumEntriesApp = FIconSema->AppIconList.lh_Type,
NumEntries = NumEntriesVol + NumEntriesApp;
BOOL NoErr = TRUE;
// Write all entries of volume list
if((Error = WriteChunkBytes(PrefsHandle, &NumEntries, sizeof(UWORD))) == sizeof(UWORD))
{
ThisEntry = (struct VolEntry *)FIconSema->VolumeList.lh_Head;
// Write list of volumes
while(NumEntriesVol-- && NoErr)
{
UWORD EntryType = ThisEntry->Link.ln_Type;
if((Error = WriteChunkBytes(PrefsHandle, &EntryType, sizeof(UWORD))) == sizeof(UWORD))
{
if((Error = WriteChunkBytes(PrefsHandle, &ThisEntry->VolName, 130)) == 130)
{
if((Error = WriteChunkBytes(PrefsHandle, &ThisEntry->IconName, 256)) == 256)
{
if((Error = WriteChunkBytes(PrefsHandle, &ThisEntry->Left, (sizeof(UWORD) * 36))) != (sizeof(UWORD) * 36))
NoErr = FALSE;
}
}
}
ThisEntry = (struct VolEntry *)ThisEntry->Link.ln_Succ;
}
// Write list of AppIcons
ThisEntry = (struct VolEntry *)FIconSema->AppIconList.lh_Head;
while(NumEntriesApp-- && NoErr)
{
UWORD EntryType = ThisEntry->Link.ln_Type;
if((Error = WriteChunkBytes(PrefsHandle, &EntryType, sizeof(UWORD))) == sizeof(UWORD))
{
if((Error = WriteChunkBytes(PrefsHandle, &ThisEntry->VolName, 130)) == 130)
{
if((Error = WriteChunkBytes(PrefsHandle, &ThisEntry->IconName, 256)) == 256)
{
if((Error = WriteChunkBytes(PrefsHandle, &ThisEntry->Left, (sizeof(UWORD) * 36))) != (sizeof(UWORD) * 36))
NoErr = FALSE;
}
}
}
ThisEntry = (struct VolEntry *)ThisEntry->Link.ln_Succ;
}
if(NoErr)
{
if(!(Error = PopChunk(PrefsHandle)))
GoOn = TRUE;
}
}
}
}
if((Error = PopChunk(PrefsHandle)))
GoOn = FALSE;
CloseIFF(PrefsHandle);
}
Close(PrefsHandle->iff_Stream);
}
else
Error = IoErr();
FreeIFF(PrefsHandle);
}
else
Error = ERR_NOMEM;
if(!GoOn)
DisplayError(Error, (ULONG)PrefsName);
ReleaseSemaphore(&FIconSema->FIconSema);
return(GoOn);
}
/**********************************************************************/
/* Make a specific entry diskchange */
/**********************************************************************/
static void DskChange(struct VolEntry *ListEntry)
{
struct List ChangeList;
NewList(&ChangeList);
// Create list of connected devices
if(GetDosEntries(&ChangeList, LDF_VOLUMES))
{
struct DosList *DList;
struct VolEntry *ThisEntry;
struct DevProc *DevProc;
char DevName[130];
BOOL FoundDev,
DoDskCh;
// Loop for all volumes in list
while((ThisEntry = (struct VolEntry *)RemHead(&ChangeList)))
{
FoundDev = FALSE;
// Find name of device this volume resides in
if((DList = LockDosList(LDF_DEVICES|LDF_READ)))
{
while((DList = NextDosEntry(DList, LDF_DEVICES|LDF_READ)))
{
if(ThisEntry->DriverTask == DList->dol_Task)
{
setmem(DevName, 130, 0);
strncpy(DevName, ((char *)BADDR(DList->dol_Name) + 1), *((char *)BADDR(DList->dol_Name)));
FoundDev = TRUE;
}
}
UnLockDosList(LDF_DEVICES|LDF_READ);
}
// Found corresponding device ???
if(FoundDev)
{
// Check whether to diskchange
if(ListEntry->Link.ln_Type == LDF_DEVICES)
DoDskCh = (MyStrCmp(ListEntry->VolName, DevName) == 0);
else
DoDskCh = (MyStrCmp(ListEntry->VolName, ThisEntry->VolName) == 0);
// Diskchange device ???
if(DoDskCh)
{
strcat(DevName, ":");
if(ThisEntry->DriverTask && (DevProc = GetDeviceProc(DevName, NULL)))
{
if(TypeOfMem(DevProc->dvp_Port))
{
if(DoPkt(DevProc->dvp_Port, ACTION_INHIBIT, DOSTRUE, NULL, NULL, NULL, NULL))
DoPkt(DevProc->dvp_Port, ACTION_INHIBIT, DOSFALSE, NULL, NULL, NULL, NULL);
}
FreeDeviceProc(DevProc);
}
}
}
FreeVecPool(FIconSema, ThisEntry);
}
}
}
/**********************************************************************/
/* Get a list of all available tasks */
/**********************************************************************/
static BOOL AddTaskEntry(struct Task *NewTask)
{
struct Process *NewProc = (struct Process *)NewTask;
struct VolEntry *NewEntry;
char *TaskName = NewTask->tc_Node.ln_Name,
Buffer[132];
UWORD NameLen = strlen(TaskName);
// Task a process?
if(NewTask->tc_Node.ln_Type == NT_PROCESS && NewProc->pr_CLI)
{
struct CommandLineInterface *CLI = BADDR(NewProc->pr_CLI);
if(CLI->cli_Module && CLI->cli_CommandName)
{
char *Dummy = BADDR(CLI->cli_CommandName);
NameLen = *Dummy++;
TaskName = Dummy;
}
}
setmem(Buffer, 132, 0);
strncpy(Buffer, TaskName, (NameLen >= 130 ? 130 : NameLen));
if((NewEntry = AllocVecPool(FIconSema, sizeof(struct VolEntry))))
{
AddTail(&AppAvailableList, (struct Node *)NewEntry);
strcpy(NewEntry->VolName, Buffer);
NewEntry->Link.ln_Name = NewEntry->VolName;
NewEntry->Link.ln_Type = FICON_APPICON;
AppAvailableList.lh_Type++;
return(TRUE);
}
return(FALSE);
}
static BOOL GetTaskList(struct List *AppList)
{
struct Task *SelectTask;
BOOL Failed;
NewList(AppList);
Forbid();
// Add my task
Failed = !AddTaskEntry(SysBase->ThisTask);
// Add ready tasks
if(!Failed && !IsListEmpty(&SysBase->TaskReady))
{
SelectTask = (struct Task *)SysBase->TaskReady.lh_Head;
while(SelectTask->tc_Node.ln_Succ && !Failed)
{
Failed = !AddTaskEntry(SelectTask);
SelectTask = (struct Task *)SelectTask->tc_Node.ln_Succ;
}
}
// Add waiting tasks
if(!Failed && !IsListEmpty(&SysBase->TaskWait))
{
SelectTask = (struct Task *)SysBase->TaskWait.lh_Head;
while(SelectTask->tc_Node.ln_Succ && !Failed)
{
Failed = !AddTaskEntry(SelectTask);
SelectTask = (struct Task *)SelectTask->tc_Node.ln_Succ;
}
}
Permit();
// Sort list
SortList(AppList, TRUE);
// Indicate failure
return((BOOL)(!Failed));
}
/**********************************************************************/
/* Query a filename */
/**********************************************************************/
static BOOL GetFileName(struct Window *Window, char *Title, char *FileName, ULONG Flags1)
{
struct Rectangle ScrRec;
struct FileRequester *FileReq;
char Drawer[514],
File[514];
UWORD Left,
Top,
Width,
Height;
BOOL Result = FALSE;
if(QueryOverscan(GetVPModeID(&Window->WScreen->ViewPort), &ScrRec, OSCAN_TEXT))
{
Width = ((ScrRec.MaxX - ScrRec.MinX + 1) * 45) / 100;
Height = ((ScrRec.MaxY - ScrRec.MinY + 1) * 8) / 10;
Left = (((ScrRec.MaxX + 1) - Width) >> 1) - Window->WScreen->LeftEdge;
Top = (((ScrRec.MaxY + 1) - Height) >> 1) - Window->WScreen->TopEdge;
// Get Patch of filename
setmem(Drawer, 514, 0);
if((char *)PathPart(FileName) != (char *)&FileName[0])
{
strncpy(Drawer, FileName, (PathPart(FileName) - FileName));
}
// Get Filename
strcpy(File, FilePart(FileName));
// Set up pattern
if((FileReq = AllocAslRequestTags(ASL_FileRequest,
ASLFR_Screen, Window->WScreen,
ASLFR_Window, Window,
ASLFR_PrivateIDCMP, TRUE,
ASLFR_SleepWindow, TRUE,
ASLFR_TitleText, Title,
ASLFR_InitialDrawer, (ULONG)Drawer,
ASLFR_InitialFile, (ULONG)File,
ASLFR_InitialLeftEdge, Left,
ASLFR_InitialTopEdge, Top,
ASLFR_InitialWidth, Width,
ASLFR_InitialHeight, Height,
ASLFR_Flags1, Flags1,
ASLFR_Flags2, FRF_REJECTICONS,
TAG_DONE)))
{
if(AslRequest(FileReq, NULL) && (strlen(FileReq->fr_File)))
{
// Create filetypes again
strcpy(FileName, "");
AddPart(FileName, FileReq->fr_Drawer, 512);
AddPart(FileName, FileReq->fr_File, 512);
Result = TRUE;
}
FreeAslRequest(FileReq);
}
}
return(Result);
}
/**********************************************************************/
/* Clone the contents of a list */
/**********************************************************************/
static BOOL CloneList(struct List *ToList, struct List *FromList)
{
struct VolEntry *FromEntry,
*ToEntry;
BOOL Result = TRUE;
NewList(ToList);
FromEntry = (struct VolEntry *)FromList->lh_Head;
ToList->lh_Type = FromList->lh_Type;
while(FromEntry->Link.ln_Succ && Result)
{
if((ToEntry = AllocVecPool(FIconSema, sizeof(struct VolEntry))))
{
*ToEntry = *FromEntry;
ToEntry->Link.ln_Name = ToEntry->VolName;
AddTail(ToList, (struct Node *)ToEntry);
}
else
Result = FALSE;
FromEntry = (struct VolEntry *)FromEntry->Link.ln_Succ;
}
if(!Result)
{
FreeDevVolList(ToList);
DisplayError(ERR_NOMEM, NULL);
}
return(Result);
}
/**********************************************************************/
/* Now include the LoadRoutine and the VolumeList routine */
/**********************************************************************/
#include "LoadPrefs.h"
#include "VolList.h"
#include "Error.h"
#include "Rendezvous.h"
#include "CheckToolTypes.h"
#include "PoolVec.h"